答案 0 :(得分:4)
这是因为浮点值的二进制表示。某些浮点值无法在给定的内存空间中精确表示,因此它们会舍入到适合的值。有关this的详细信息,请查看此帖子。如果你想避免这种情况,大多数编程语言都有一个使用base 10算法的数据类型,并没有这个限制。对于NSDecimalNumber
的swift,请注意通常这种数据类型要慢得多。
答案 1 :(得分:1)
实际上非常简单。当你有一个基础10系统(像我们的)时,它只能表示使用基数的素数因子的分数。 10的素因子是2和5.所以1 / 2,1 / 4,1 / 5,1 / 8和1/10都可以干净地表达,因为分母都使用10的素因子。相比之下,1 / 3,1 / 6和1/7都是重复小数,因为它们的分母使用素数因子3或7.在二进制(或基数2)中,唯一的素数因子是2.所以你只能干净地表示分数仅包含2作为主要因素。在二进制中,1 / 2,1 / 4,1 / 8都将以小数形式干净地表示。而1/5或1/10将重复小数。因此,在基本10系统中,0.1和0.2(1/10和1/5),而干净的小数位,是计算机运行的基本2系统中的重复小数。当您对这些重复小数进行数学运算时,您最终得到剩余的小数当您将计算机的基本2(二进制)编号转换为更易读的基数10时,它会继续存在。
更多详情: