![]() |
Приведение Number в String без потерь
Есть такой код
Код AS3:
num.toString() работает точно также. Мне это категорически не подходит. Как мне преобразовать Number в String, чтобы в итоге получилась строка: '0.940544481142550815427045414574' ? |
А что выдаёт trace(num)?
|
Цитата:
Добавлено через 7 часов 39 минут Решение нашел в таком виде. Правильность хеширования можно проверить в интернете. Для моей задачи подходит, вот и хорошо. Хотя тут же на ум приходит более "изящное" решение, которое впрочем выкладывать незачем. Код AS3:
|
Цитата:
|
В результате вычислений вообще никакое число не получается, потому что вычисления мне выводят строку с данным числом, в чем и заключалась задача. Или я неправильно понял вопрос.
|
бр, так требовалось же Number в String перегнать.Если это и так стринг, не совсем понятно в чем, собственно, проблема.
|
Видимо все-таки я вопрос неправильно понял. Изначально да, у нас Number. В том решении которое я привел, у нас этот Number разбивается на две половинки, т.е. две переменные Number, которые по отдельности успешно преобразовываются в String, а потом просто конкатенируются в один String, который мне и нужен.
Добавлено через 4 минуты А, понял теперь изначальный вопрос. Суть глобальной задачи в том, что мне нужно создать огромную базу данных со всеми хэшами строковых чисел от 0.000000000000000000000000000000 до 0.999999999999999999999999999999 Число 0.940544481142550815427045414574 я взял как для примера, который в самом начале мне не удавалось преобразовать в строку. |
ну вот я и спрашиваю этот изначальный number в результате каких-то вычислений получается?Уж очень много в нем значащих цифр.
Цитата:
Код AS3:
|
Цитата:
Ну а так получается, что внутренняя реализация функции trace() применяет .toString() ко всем не строковым входным параметрам. А именно .toString() и обрезает число. IntellijIDEA 14 |
скорее обрезание еще на этапе присвоения происходит т.к. число знаков выше машинной точности
|
Сомневаюсь. В справочнике адоб пишут:
MAX_VALUE Константа public static const MAX_VALUE:Number Язык версии: ActionScript 3.0 Версии среды выполнения: AIR 1.0, Flash Player 9, Flash Lite 4 Наибольшее представимое число (число IEEE-754 с удвоенной точностью). Это число равно примерно 1,79e+308. А у меня знаков вроде как меньше 308. Или я что-то не так понял в приведенном тексте. |
твое число можно записать как
940544481142550815427045414574e-1 где 9405444.. - мантисса -1 - порядок Так вот, согласно IEEE-754 под мантиссу отводится 52 бита под порядок - 11 бит Т.е. макс. число которое может быть в мантиссе без потери точности: 2^52= 4503599627370496 а у тебя там 940544481142550815427045414574 Добавлено через 2 минуты для справки |
Там максимум 16 цифр. Нули не в счёт. Остальные обрезаются.
Если у вас Код:
0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001Код:
0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012345678910111268... |
да ,т.к. 2^52 соответствует 16-ти десятичным порядкам
|
Ага, теперь всё стало ясно. Тогда действительно кроме как разбивки на два числа, по другому не получится преобразовывать. Спасибо большое за прояснение причины обрезания!
|
еще как вариант разбить весь диапазон на интервалы длиной в maxInt и генерить хэши кусками, а числа сразу в виде стрингов создавать.
|
Ну, я почти что-то понял )
|
Может для as3 есть что-нибудь типа BigDecimal?
|
Получилось нагуглить
https://github.com/maurice/BigDecimal.as https://code.google.com/archive/p/bigdecimal/ Работоспособность не проверял :) |
У вас есть 52 бита в Number для хранения мантисы. Остальное уходит на знак, порядок и прочее.
В мантисе будет лежать в данном случае 1111000011000111100001011110101011110000110001111000, а остальное будет отрезано. При представлении в десятичном виде вышеприведённая двоичная запись должна была бы стать 0.9405444811425507367630416410975158214569091796875, но она "округлиться" 16-и знаков после запятой и в следствии этого вы получаете 0.9405444811425508 |
Цитата:
|
В любом другом языке будет работать точно так же, разве что есть в Java и C# есть decimal. Ещё я думаю что для хешей всех иррациональных чисел памяти не хватит по подсчетам таблица будет объемом не менее 10в15 петабайт
|
Цитата:
Иррациональное - это, например, π(пи), или e(экспонента), или квадратный корень из 2. Т.е. когда последовательность чисел после точки никогда не повторяется и не заканчивается. Цитата:
|
Цитата:
|
почему?Никто не заставляет все за один раз делать.
|
Цитата:
|
результат можно хоть в текстовый файл складывать
|
Цитата:
|
Цитата:
|
| Часовой пояс GMT +4, время: 17:21. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.