Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Неточности округления (https://javascript.ru/forum/misc/73005-netochnosti-okrugleniya.html)

Noga_programmista 13.03.2018 13:02

Неточности округления
 
Начал изучать JS. И при попытке разобраться с округлением наткнулся на небольшую несостыковочку. Объясните почему так может происходить! Спасибо!
var result = Math.random();
alert(  100*result.toFixed(2) + " = " + result );


выдаёт следующее (примерно один раз из 10 ) :

14.000000000000002 = 0.13503872339659528

все остальные разы работает корректно:

66 = 0.6598168820795063

Dilettante_Pro 13.03.2018 13:16

Зато такой вариант этого не сделает
var result = Math.random();
        alert(  (100*result).toFixed(0) + " = " + result );


toFixed() дает символьное представление округленного числа, свободное от хвостов, определяемых бинарным представлением чисел

Aetae 13.03.2018 13:17

https://learn.javascript.ru/number#неточные-вычисления

Noga_programmista 13.03.2018 13:29

Ну ваш вариант немного не то выдаёт что мне необходимо... но щас поколдую с вашим предложением.

Dilettante_Pro 13.03.2018 13:31

Noga_programmista,
Если вы про мой - то уже, наверное, то.

MallSerg 13.03.2018 13:31

потому что порядок выполнения операторов
1. операция умножения с двумя операндами т.к. язык с динамической типизацией то операнды приводятся к одному типу.
т.е. после операции «result.toFixed(2)» привидения к строке результат выражения «result.toFixed(2)» снова приводится к числу для проведения операции умножения.

В JS для хранения типа Number используются только число с плавающей точкой т.е. точная арифметика в JS невозможна (без плясок с бубном)

поможет изменения порядка операций с использованием скобок

var result = Math.random();
alert(  (100*result).toFixed(2) + " = " + result)

Noga_programmista 13.03.2018 13:32

Dilettante_Pro,
Да, щас то...Спасибо!

Noga_programmista 13.03.2018 13:36

MallSerg,
Тоесть когда результат «result.toFixed(2)» снова приводится к числу, в этот момент появляется неточность?

Dilettante_Pro 13.03.2018 13:37

Цитата:

Сообщение от Noga_programmista
Тоесть когда результат «result.toFixed(2)» снова приводится к числу, в этот момент появляется неточность?

Вот именно.

Noga_programmista 13.03.2018 13:44

Dilettante_Pro,
Окей... А тогда подскажите, как лучше работать с такими числами? Как уже сказали выше, брать буден, и использовать его, или есть какие-то, не знаю как правильно выразится... правила для работы с ними?


Часовой пояс GMT +3, время: 15:51.