Неточности округления
Начал изучать JS. И при попытке разобраться с округлением наткнулся на небольшую несостыковочку. Объясните почему так может происходить! Спасибо!
var result = Math.random(); alert( 100*result.toFixed(2) + " = " + result ); выдаёт следующее (примерно один раз из 10 ) : 14.000000000000002 = 0.13503872339659528 все остальные разы работает корректно: 66 = 0.6598168820795063 |
Зато такой вариант этого не сделает
var result = Math.random(); alert( (100*result).toFixed(0) + " = " + result ); toFixed() дает символьное представление округленного числа, свободное от хвостов, определяемых бинарным представлением чисел |
|
Ну ваш вариант немного не то выдаёт что мне необходимо... но щас поколдую с вашим предложением.
|
Noga_programmista,
Если вы про мой - то уже, наверное, то. |
потому что порядок выполнения операторов
1. операция умножения с двумя операндами т.к. язык с динамической типизацией то операнды приводятся к одному типу. т.е. после операции «result.toFixed(2)» привидения к строке результат выражения «result.toFixed(2)» снова приводится к числу для проведения операции умножения. В JS для хранения типа Number используются только число с плавающей точкой т.е. точная арифметика в JS невозможна (без плясок с бубном) поможет изменения порядка операций с использованием скобок var result = Math.random(); alert( (100*result).toFixed(2) + " = " + result) |
Dilettante_Pro,
Да, щас то...Спасибо! |
MallSerg,
Тоесть когда результат «result.toFixed(2)» снова приводится к числу, в этот момент появляется неточность? |
Цитата:
|
Dilettante_Pro,
Окей... А тогда подскажите, как лучше работать с такими числами? Как уже сказали выше, брать буден, и использовать его, или есть какие-то, не знаю как правильно выразится... правила для работы с ними? |
Часовой пояс GMT +3, время: 15:51. |