Форум 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 06:37

Приведение Number в String без потерь
 
Есть такой код
Код AS3:

var num:Number = 0.940544481142550815427045414574;
var str:String = String(num);
trace(str);

В консоль выводит: 0.9405444811425508
num.toString() работает точно также.
Мне это категорически не подходит.
Как мне преобразовать Number в String, чтобы в итоге получилась строка: '0.940544481142550815427045414574' ?

illuzor 12.11.2017 07:39

А что выдаёт trace(num)?

Dzzirtuoz 12.11.2017 07:52

Цитата:

Сообщение от illuzor (Сообщение 1202880)
А что выдаёт trace(num)?

Блин, вроде и понимал, что может возникнуть у кого-то такой вопрос, но почему-то не стал заранее говорить, что мне категорически нужна именно строка(мне её нужно хешировать). И да, trace(num) выводит число целиком, ни больше ни меньше, ровно то, что находится в num. Ну и добавлю, на всякий случай: напрямую создавать строку тоже не могу, нужно именно преобразовывать из Number.

Добавлено через 7 часов 39 минут
Решение нашел в таком виде. Правильность хеширования можно проверить в интернете. Для моей задачи подходит, вот и хорошо. Хотя тут же на ум приходит более "изящное" решение, которое впрочем выкладывать незачем.
Код AS3:

public class Main extends Sprite {
    private var num1:Number = 0.0000000000000000;
    private var num2:Number = 00000000000001;
 
    public function Main() {
        init();
    }
 
    private function init():void {
        var str1:String = String(num1);
        var str2:String = String(num2);
        trace(str1+str2 + ' ' + SHA224.hash(str1+str2));
 
        /*Хэш раунда: 96908a81bb4f80d71925f40c05d741c8e0849dddb500c135fd46d885cd8de8b2
        Число раунда: 0.940544481142550815427045414574*/

    }
}


undefined 12.11.2017 15:53

Цитата:

var num:Number = 0.940544481142550815427045414574;
а такое число получается в результате вычислений?

Dzzirtuoz 12.11.2017 15:56

В результате вычислений вообще никакое число не получается, потому что вычисления мне выводят строку с данным числом, в чем и заключалась задача. Или я неправильно понял вопрос.

undefined 12.11.2017 16:08

бр, так требовалось же Number в String перегнать.Если это и так стринг, не совсем понятно в чем, собственно, проблема.

Dzzirtuoz 12.11.2017 16:19

Видимо все-таки я вопрос неправильно понял. Изначально да, у нас Number. В том решении которое я привел, у нас этот Number разбивается на две половинки, т.е. две переменные Number, которые по отдельности успешно преобразовываются в String, а потом просто конкатенируются в один String, который мне и нужен.

Добавлено через 4 минуты
А, понял теперь изначальный вопрос. Суть глобальной задачи в том, что мне нужно создать огромную базу данных со всеми хэшами строковых чисел от 0.000000000000000000000000000000 до 0.999999999999999999999999999999
Число 0.940544481142550815427045414574 я взял как для примера, который в самом начале мне не удавалось преобразовать в строку.

undefined 12.11.2017 16:27

ну вот я и спрашиваю этот изначальный number в результате каких-то вычислений получается?Уж очень много в нем значащих цифр.
Цитата:

И да, trace(num) выводит число целиком, ни больше ни меньше, ровно то, что находится в num.
Не знаю как у вас, а у меня
Код AS3:

var num:Number = 0.940544481142550815427045414574;
trace(num);

выдает 0.9405444811425508 ни больше, ни меньше.Animate 2017

Dzzirtuoz 12.11.2017 16:37

Цитата:

Сообщение от undefined (Сообщение 1202890)
Не знаю как у вас, а у меня
Код AS3:

var num:Number = 0.940544481142550815427045414574;
trace(num);

выдает 0.9405444811425508 ни больше, ни меньше.Animate 2017

Проверил еще раз у себя, чтобы убедиться что у меня правильно выводит, а убедился, что выводит 0.9405444811425508. Хм, странно, почему это я в прошлый раз так уверенно сказал, что все правильно выводит.
Ну а так получается, что внутренняя реализация функции trace() применяет .toString() ко всем не строковым входным параметрам. А именно .toString() и обрезает число. IntellijIDEA 14

undefined 12.11.2017 16:43

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

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

caseyryan 14.11.2017 06:22

Цитата:

Суть глобальной задачи в том, что мне нужно создать огромную базу данных со всеми хэшами строковых чисел от 0.000000000000000000000000000000 до 0.999999999999999999999999999999
Не совсем понятно для чего нужна такая база данных, это дело десятое. Но вот то, что для этой задачи выбран не подходящий язык - это 100%)

Nooob 14.11.2017 13:43

В любом другом языке будет работать точно так же, разве что есть в Java и C# есть decimal. Ещё я думаю что для хешей всех иррациональных чисел памяти не хватит по подсчетам таблица будет объемом не менее 10в15 петабайт

ZackMercury 14.11.2017 13:55

Цитата:

иррациональных
Так они вроде рациональные :)
Иррациональное - это, например, π(пи), или e(экспонента), или квадратный корень из 2.
Т.е. когда последовательность чисел после точки никогда не повторяется и не заканчивается.

Цитата:

Иррациона́льное число́ — это вещественное число, которое не является рациональным, то есть не может быть представлено в виде дроби m/n, где m — целое число, n — натуральное число.
Ratio переводится как "соотношение", а также как "разум". Тоесть, иррациональные числа - они не поддаются разуму и представлению в виде соотношения. :)

caseyryan 14.11.2017 15:13

Цитата:

Сообщение от Nooob (Сообщение 1202931)
В любом другом языке будет работать точно так же, разве что есть в Java и C# есть decimal. Ещё я думаю что для хешей всех иррациональных чисел памяти не хватит по подсчетам таблица будет объемом не менее 10в15 петабайт

Про числа понятно. Я имел в виду огромную базу данных. АС3 для этого точно не лучший выбор

undefined 14.11.2017 15:16

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

caseyryan 14.11.2017 15:19

Цитата:

Сообщение от undefined (Сообщение 1202935)
почему?Никто не заставляет все за один раз делать.

А с какими базами данных, кроме SQLite умеет работатать ас3?

undefined 14.11.2017 15:52

результат можно хоть в текстовый файл складывать

caseyryan 15.11.2017 06:55

Цитата:

Сообщение от undefined (Сообщение 1202941)
результат можно хоть в текстовый файл складывать

Ага, я об этом и говорю. Язык не подходящий. Вся эта телега будет очень дико тормозить, пока вообще не закончится память и всё не ляжет. Для таких огромных баз данных даже MySQL не лучший выбор. Похоже автор даже не представляет, насколько это будет огромная база, если сохранить туда все доступные числа

Nooob 15.11.2017 14:45

Цитата:

Сообщение от ZackMercury (Сообщение 1202932)
Так они вроде рациональные

А, ну да) мозг почему-то решил что все дико длинные числа после точки иррациональные


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

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