用于循环做不好数学运算的Javascript

用于循环做不好数学运算的Javascript,javascript,loops,for-loop,Javascript,Loops,For Loop,有人知道编程语言的核心、基本功能是如何失去正确/精确计算的能力的吗 为什么我的数字(如0.1+0.2)加起来不是很好的一轮0.3,而是得到一个奇怪的结果,如0.300000000000000004? 因为在内部,计算机使用的格式(二进制浮点)根本不能准确地表示0.1、0.2或0.3这样的数字 在编译或解释代码时,您的“0.1”已经四舍五入到该格式中最接近的数字,这甚至会在计算之前产生一个小的四舍五入错误 为什么计算机使用如此愚蠢的系统? 这并不愚蠢,只是不同而已。十进制数字不能准确地表示1/3

有人知道编程语言的核心、基本功能是如何失去正确/精确计算的能力的吗


为什么我的数字(如0.1+0.2)加起来不是很好的一轮0.3,而是得到一个奇怪的结果,如0.300000000000000004?

因为在内部,计算机使用的格式(二进制浮点)根本不能准确地表示0.1、0.2或0.3这样的数字

在编译或解释代码时,您的“0.1”已经四舍五入到该格式中最接近的数字,这甚至会在计算之前产生一个小的四舍五入错误

为什么计算机使用如此愚蠢的系统?

这并不愚蠢,只是不同而已。十进制数字不能准确地表示1/3这样的数字,所以你必须四舍五入到0.33左右——你也不希望0.33+0.33+0.33加起来等于1,是吗

计算机使用二进制数是因为它们处理二进制数的速度更快,而且对于大多数计算来说,小数点后第17位的微小错误根本不重要,因为您使用的数字不是四舍五入(或那样精确)

如何避免此问题?

这取决于你在做什么样的计算

如果你真的需要你的结果精确相加,特别是当你处理钱的时候:使用一个特殊的十进制数据类型。 如果您只是不想看到所有这些额外的小数位:只需在显示结果时将结果四舍五入到固定的小数位。 如果没有可用的十进制数据类型,另一种方法是使用整数,例如完全以美分计算货币。但这是更多的工作,也有一些缺点。 为什么像0.1+0.4这样的其他计算可以正常工作

在这种情况下,结果(0.5)可以精确地表示为一个浮点数,输入数中的舍入误差可能会相互抵消,但这不一定可靠(例如,当这两个数字首先存储在不同大小的浮点表示中时,舍入误差可能不会相互抵消)


在其他情况下,如0.1+0.3,结果实际上不是0.4,但非常接近,因此0.4是最短的数字,与任何其他浮点数相比,它更接近结果。许多语言都会显示该数字,而不是将实际结果转换回最接近的小数。

浮点数的定义是不精确。由于数字的表示精度有限,因此无法表示所有数字

在循环中使用整数值并从中计算值。虽然这仍然是浮点值,但将一添加到数字中不会出现精度问题:

var html = '';
for(var i = 0; i <= 100; i++){
  html += (i / 100) + '<br />';
}
document.body.innerHTML = html;
var html='';
对于(var i=0;i
var html='';
对于(var i=0;i
0
0.01
0.02
0.03
0.04
0.05
0.060000000000000005
0.07
0.08
0.09
0.09999999999999999
0.10999999999999999
var html = '';
for(var i = 0; i <= 100; i++){
  html += (i / 100) + '<br />';
}
document.body.innerHTML = html;
var html = '';
for(var i = 0; i <= 1; i += 0.01){
     html += i.toFixed(2) + '<br />';
}
document.body.innerHTML = html;