1 (изменено: MikeSh, 2016-06-27 13:12:08)

Тема: VBS: Перевод из 36 в 10 систему счисления

Добрый день.

Set lDict = CreateObject("Scripting.Dictionary")
lDict.Add "0", 0
lDict.Add "1", 1
lDict.Add "2", 2
lDict.Add "3", 3
lDict.Add "4", 4
lDict.Add "5", 5
lDict.Add "6", 6
lDict.Add "7", 7
lDict.Add "8", 8
lDict.Add "9", 9
lDict.Add "A", 10
lDict.Add "B", 11
lDict.Add "C", 12
lDict.Add "D", 13
lDict.Add "E", 14
lDict.Add "F", 15
lDict.Add "G", 16
lDict.Add "H", 17
lDict.Add "I", 18
lDict.Add "J", 19
lDict.Add "K", 20
lDict.Add "L", 21
lDict.Add "M", 22
lDict.Add "N", 23
lDict.Add "O", 24
lDict.Add "P", 25
lDict.Add "Q", 26
lDict.Add "R", 27
lDict.Add "S", 28
lDict.Add "T", 29
lDict.Add "U", 30
lDict.Add "V", 31
lDict.Add "W", 32
lDict.Add "X", 33
lDict.Add "Y", 34
lDict.Add "Z", 35

a = "000003PNKXIIEVSB"
Re = 0
For i = 0 To Len(a) - 1
  CurL = Mid(a, i + 1, 1)
  Re = Re + lDict.Item(CurL)*(36^(Len(a) - i))
Next
msgbox Re

С алгоритмом перевода проблем нет, проблема с получением результата, например такого

4,88664000042785E+17

Собственно вопрос, как получить число полностью, без E+?
Пробовал FormatNumber, но там в конце нули, т.е. заведомо неправильный результат.
Заранее спасибо.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

2

Re: VBS: Перевод из 36 в 10 систему счисления

Вы тут прежде всего упираетесь в границу точности того типа числа, который использует в данном случае VBS в переменной Re. Это дробное число двойной точности (VT_R8), которое в памяти хранится в виде мантиссы и экспоненты, и мантисса имеет 53 бита. Т.е. вплоть до числа 9007199254740992 можно этим типом выразить каждое число. Дальше только каждое второе, потом каждое четвёртое и т.д. Т.е. такие числа, у которых дальше первых 53 битов идут нули. Поэтому и в десятичном представлении есть ограничение на число значащих цифр.

Так что, если не хотите цифры терять, придётся переводить из строкового представления в строковое, минуя числовую переменную.

3

Re: VBS: Перевод из 36 в 10 систему счисления

YMP
Я примерно так и понял, что с разрядностью проблема (попутно нашёл ошибку в скрипте, но это не важно)
А вот как

переводить из строкового представления в строковое, минуя числовую переменную.

хотелось бы узнать по подробнее.

В данный момент реализовал весь функционал на ahk, там такой проблемы нет, но он мне меньше нравится, я его (синтаксис) не всегда понимаю.

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

4

Re: VBS: Перевод из 36 в 10 систему счисления

MikeSh пишет:

хотелось бы узнать по подробнее.

Вычислять каждую цифру по очереди, не аккумулируя всё число в одной переменной.

В AutoHotkey числа 64-битные знаковые, т.е. получается 63 значащих бита. Если число перевалит за 0x7FFFFFFFFFFFFFFF, то начинает отображаться как отрицательное.

5

Re: VBS: Перевод из 36 в 10 систему счисления

YMP пишет:

Вычислять каждую цифру по очереди, не аккумулируя всё число в одной переменной.

Не понял.
Как вычислить 36 в 15 степени без использования числовой переменной?

"Единство,- возвестил оракул наших дней: -
Быть может спаяно железом лишь и кровью"…
Но мы попробуем спаять его любовью,-
А там увидим, что прочней…    (Ф. Тютчев)       Тут хорошая справка по vbs.

6

Re: VBS: Перевод из 36 в 10 систему счисления

Не то чтобы вообще без использования числовых переменных, а вот без этой общей, куда вы всё суммируете. Поразрядно вычислять.

7

Re: VBS: Перевод из 36 в 10 систему счисления

Хотя не так тут всё просто, как сперва подумалось. Ведь если в одной системе счисления справа нули, то в другой это не так.