Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Приведение Number в String без потерь (http://www.flasher.ru/forum/showthread.php?t=214718)

Dzzirtuoz 12.11.2017 16:47

Сомневаюсь. В справочнике адоб пишут:
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. Или я что-то не так понял в приведенном тексте.

undefined 12.11.2017 16:56

твое число можно записать как
940544481142550815427045414574e-1
где
9405444.. - мантисса
-1 - порядок
Так вот, согласно IEEE-754 под мантиссу отводится 52 бита
под порядок - 11 бит
Т.е. макс. число которое может быть в мантиссе без потери точности:
2^52=
4503599627370496
а у тебя там
940544481142550815427045414574

Добавлено через 2 минуты
для справки

ZackMercury 12.11.2017 17:00

Там максимум 16 цифр. Нули не в счёт. Остальные обрезаются.
Если у вас
Код:

0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
то ок, но если у вас
Код:

0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012345678910111268...
Всё, что вместо троеточия обрежется.

undefined 12.11.2017 17:07

да ,т.к. 2^52 соответствует 16-ти десятичным порядкам

Dzzirtuoz 12.11.2017 17:10

Ага, теперь всё стало ясно. Тогда действительно кроме как разбивки на два числа, по другому не получится преобразовывать. Спасибо большое за прояснение причины обрезания!

undefined 12.11.2017 17:15

еще как вариант разбить весь диапазон на интервалы длиной в maxInt и генерить хэши кусками, а числа сразу в виде стрингов создавать.

Dzzirtuoz 12.11.2017 17:20

Ну, я почти что-то понял )

illuzor 13.11.2017 05:37

Может для as3 есть что-нибудь типа BigDecimal?

ZackMercury 13.11.2017 10:01

Получилось нагуглить
https://github.com/maurice/BigDecimal.as
https://code.google.com/archive/p/bigdecimal/
Работоспособность не проверял :)

FlashRus 13.11.2017 19:21

У вас есть 52 бита в Number для хранения мантисы. Остальное уходит на знак, порядок и прочее.
В мантисе будет лежать в данном случае 1111000011000111100001011110101011110000110001111000, а остальное будет отрезано.

При представлении в десятичном виде вышеприведённая двоичная запись должна была бы стать 0.9405444811425507367630416410975158214569091796875, но она "округлиться" 16-и знаков после запятой и в следствии этого вы получаете 0.9405444811425508


Часовой пояс GMT +4, время: 14:37.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.