Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.03.2018, 13:02
Интересующийся
Отправить личное сообщение для Noga_programmista Посмотреть профиль Найти все сообщения от Noga_programmista
 
Регистрация: 13.03.2018
Сообщений: 17

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


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

14.000000000000002 = 0.13503872339659528

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

66 = 0.6598168820795063

Последний раз редактировалось Noga_programmista, 13.03.2018 в 13:07.
Ответить с цитированием
  #2 (permalink)  
Старый 13.03.2018, 13:16
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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


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

Последний раз редактировалось Dilettante_Pro, 13.03.2018 в 13:29.
Ответить с цитированием
  #3 (permalink)  
Старый 13.03.2018, 13:17
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,591

https://learn.javascript.ru/number#неточные-вычисления
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 13.03.2018, 13:29
Интересующийся
Отправить личное сообщение для Noga_programmista Посмотреть профиль Найти все сообщения от Noga_programmista
 
Регистрация: 13.03.2018
Сообщений: 17

Ну ваш вариант немного не то выдаёт что мне необходимо... но щас поколдую с вашим предложением.
Ответить с цитированием
  #5 (permalink)  
Старый 13.03.2018, 13:31
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Noga_programmista,
Если вы про мой - то уже, наверное, то.
Ответить с цитированием
  #6 (permalink)  
Старый 13.03.2018, 13:31
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,139

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

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

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

var result = Math.random();
alert(  (100*result).toFixed(2) + " = " + result)
Ответить с цитированием
  #7 (permalink)  
Старый 13.03.2018, 13:32
Интересующийся
Отправить личное сообщение для Noga_programmista Посмотреть профиль Найти все сообщения от Noga_programmista
 
Регистрация: 13.03.2018
Сообщений: 17

Dilettante_Pro,
Да, щас то...Спасибо!
Ответить с цитированием
  #8 (permalink)  
Старый 13.03.2018, 13:36
Интересующийся
Отправить личное сообщение для Noga_programmista Посмотреть профиль Найти все сообщения от Noga_programmista
 
Регистрация: 13.03.2018
Сообщений: 17

MallSerg,
Тоесть когда результат «result.toFixed(2)» снова приводится к числу, в этот момент появляется неточность?
Ответить с цитированием
  #9 (permalink)  
Старый 13.03.2018, 13:37
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Сообщение от Noga_programmista
Тоесть когда результат «result.toFixed(2)» снова приводится к числу, в этот момент появляется неточность?
Вот именно.
Ответить с цитированием
  #10 (permalink)  
Старый 13.03.2018, 13:44
Интересующийся
Отправить личное сообщение для Noga_programmista Посмотреть профиль Найти все сообщения от Noga_programmista
 
Регистрация: 13.03.2018
Сообщений: 17

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск