2013-07-30 2 views
1

Когда я попытался выполнить этот кусок кода, его давая мне очень странный ответJavascript сложение и вычитание ведет себя странно

<script type="text/javascript"> 
    a = 17.98 + 7.99 - 17.98 - 7.99 + 0 - 0; 
    alert(a); 
</script> 

Она должна фактически дать мне ноль. Но вместо этого он дает мне экспоненциальное значение. Может кто-нибудь, пожалуйста, помогите мне с ответом.

+0

вы можете прочитать об этом здесь http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number- проблема –

ответ

2

Вы должны получить -1.7763568394002505e-15. Это составляет -1.7763568394002505 * 10^(- 15). Это значение очень близко к нулю; но тот факт, что вы не получаете нуль, связан с ошибкой округления. Это нормальное поведение.

Если вы действительно хотите знать, и выходы, вы можете узнать больше на http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

+0

Я решил проблему следующим образом: Это дает мне ровно ноль. Спасибо всем за ответ. – unknown

+1

Зачем вам нужно ровно нуля? Вы должны понять, что компьютеры всегда будут давать вам приблизительные результаты или подготовиться к головным болям. Будь рад иметь -1.7763568394002505e-15 уже! – mdup

1

Это нормальное поведение для вычислений с плавающей точкой.

Существует только ограниченное число значений, которые могут быть представлены точно в бинарном формате с плавающей запятой, поэтому большинство значений представлены как максимально возможное значение.

Значение, подобное 7.99, может быть представлено как что-то вроде 7.98999999999997754, так что это значение, которое вы действительно получаете при анализе кода.

Разница между фактическим значением и ожидаемым значением настолько мала, что не отображается, когда вы просто отображаете значение напрямую, так как значение округляется, когда оно возвращается в строковый формат. Когда вы выполняете несколько расчетов, небольшие различия складываются, и рано или поздно вы увидите это.

В результате вы получите -0.0000000000000017763568394002505, так что это очень близко к нулю, но это не совсем так.

1

Компьютеры не очень хороши при обработке плавающих точек.

например: 0,1 + 0,2 = 0,30000000000000004

Поскольку внутри, компьютеры используют формат (двоичная с плавающей точкой) , что не может точно представить ряд, как 0,1, 0,2 или 0,3 на всех. Когда код скомпилирован или интерпретирован, ваш «0,1» уже округлен до ближайшего номера в этом формате, что приводит к небольшой ошибке округления еще до того, как произойдет расчет.

читать больше на: What Every Programmer Should Know About Floating-Point Arithmetic

0
a = Math.ceil(17.98 + 7.99 - 17.98 - 7.99 + 0 - 0); 
+0

Хотя это дало бы округленное значение, оно не объясняет, почему это происходит, что я считаю вопросом. –

+0

объяснения уже были даны многими экспертами, это одно для _It должно на самом деле дать мне zero._ часть вопроса, поскольку OP, похоже, хочет округленное значение – rps

+0

Я решил проблему следующим образом: Это дает мне ровно ноль. Спасибо всем за ответ. – unknown

Смежные вопросы