更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)
计算机本身只能存储整数,因此它们需要某种方式来表示十进制小数。这种表示并不完全准确。这就是为什么 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 为base)中,唯一的质因数是 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以各种语言发送到标准输出的示例。
#include
int main(int argc, char** argv) {
printf("%.17f
", .1 + .2);
return 0;
}
#include
#include
int main() {
std::cout << std::setprecision(17) << 0.1 + 0.2;
}
package main
import "fmt"
func main() {
fmt.Println(.1 + .2)
var a float64 = .1
var b float64 = .2
fmt.Println(a + b)
fmt.Printf("%.54f
", .1 + .2)
}
输出
0.3
0.30000000000000004
0.29999999999999998889776975374843459576368331
System.out.println(.1 + .2);
System.out.println(.1F + .2F);
输出
0.30000000000000004
和
0.3
更多语言实现查看查看:https://0.30000000000000004.com/
留言与评论(共有 0 条评论) “” |