浮点数学你的语言没坏,它在做浮点数学。计算机本身只能存储整数,因此它们需要某种表示十进制数的方法。这种表示并不完全准确。这就是为什么通常0.1+0.2!=0.3。为什么会这样?这其实很有趣。当你有一个以10为底的系统(比如我们的系统)时,它只能表示使用基数的质因数的分数。10的质因数是2和5,所以1/2、1/4、1/5、1/8、1/10都可以表达的很干净,因为分母都用了10的质因数。相比之下,1/3、1/6、1/7和1/9都是循环小数,因为它们的分母使用质因数3或7。在二进制(或基数为2)中,唯一的质因数是2,因此您只能干净地表示分母只有2作为质因数的分数。在二进制中,1/2、1/4、1/8都可以清晰地表示为小数,而1/5或1/10将重复小数。所以0.1和0.2(1/10和1/5)虽然在10进制系统中是干净的小数,但在计算机使用的2进制系统中是重复的小数。当您对这些重复的小数进行数学运算时,您最终会得到剩余的部分,当您将计算机的base-2(二进制)数字转换为更易于人类阅读的base-10表示时,这些剩余部分会继续存在。以下是将.1+.2发送到各种语言的标准输出的一些示例。翻译如下:浮点数学你的语言不错,做浮点数学的计算机本身只能存储整数,所以它们需要某种表示十进制数的方法。这种表述并不完全准确。这就是为什么(通常不是)0.1+0.2!=0.3。为什么?实际上,这很有趣。当你有一个像我们这样的以10为底的系统时,它只能表示使用该基数的质数的分数。10的质数是2和5。因此,由于分母都用10的质数,所以1/2、1/4、1/5、1/8、1/10都可以表示清楚。/3、1/6、1/7和1/9都是循环小数,因为它们的分母使用质数3或7。在二进制(或基数2)中,唯一的质数是2,因此您只能清楚地表示分母只有2为质数的分数。在二进制中,1/2、1/4、1/8将完全表示为小数,而1/5或1/10将作为小数重复。因此0.1和0.2(1/10和1/5)在计算机使用的以2为基数的系统中重复小数,而在以10为基数的系统中使用干净的小数。当您使用这些重复的小数进行数学计算时,您最终会得到余数,当您将计算机的基数2(二进制)数字转换为更易于阅读的基数10表示时,余数将保留下来。以下是使用.1+.2将多种语言发送到标准输出的一些示例。Java中的情况:Java使用BigDecimal类内置了对任意精度数字的支持。所有语言的大小写:参考:《2020最新Java基础精讲视频教程和学习路线!》链接:FloatingPointMath
