当我尝试执行这段代码时,它给了我一个非常奇怪的答案
<script type="text/javascript">
a = 17.98 + 7.99 - 17.98 - 7.99 + 0 - 0;
alert(a);
</script>
实际上它应该给我一个零。但相反,它给了我一个指数值。
有人可以帮我解答。
答案 0 :(得分:2)
你应该得到-1.7763568394002505e-15。这代表-1.7763568394002505 * 10 ^( - 15)。这是一个非常接近于零的值;但是你没有得到零的事实是由于舍入错误。这是正常行为。
如果您真的想了解进出,可以在http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
了解更多信息答案 1 :(得分:1)
这是浮点计算的正常行为。
只有有限数量的值可以使用二进制浮点格式精确表示,因此大多数值都表示为最接近的可能值。
7.99
之类的值可能表示为类似7.98999999999997754
的值,因此这是解析代码时实际获得的值。
实际值与您期望的值之间的差异非常小,以至于当您只是直接显示值时它不会显示,因为当它被转换回字符串格式时,该值会被舍入。当你做几次计算时,小的差异会加起来,迟早你会看到它。
你得到的结果是-0.0000000000000017763568394002505
,所以它非常接近零,但它并不完全为零。
答案 2 :(得分:1)
计算机在处理浮点方面并不是很好。
例如: 0.1 + 0.2 = 0.30000000000000004
因为在内部,计算机使用格式(二进制浮点) 不能准确地表示0.1,0.2或0.3之类的数字。 编译或解释代码时,您的“0.1”已经存在 四舍五入到该格式的最接近的数字,这导致一个小的 甚至在计算发生之前就会出现舍入错误。
详细了解:What Every Programmer Should Know About Floating-Point Arithmetic
答案 3 :(得分:0)
a = Math.ceil(17.98 + 7.99 - 17.98 - 7.99 + 0 - 0);