gpt4 book ai didi

c# - 为什么是双舍入而小数不是?

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:13 25 4
gpt4 key购买 nike

以下 C# 代码:

int n = 3;
double dbl = 1d / n;
decimal dec = 1m / n;
Console.WriteLine(dbl * n == 1d);
Console.WriteLine(dec * n == 1m);

输出

True
False

显然,doubledecimal 都不能准确表示 1/3。但是 dbl * n 四舍五入为 1 而 dec * n 不是。为什么?这种行为记录在哪里?

更新

请注意,我这里的主要问题是为什么它们的行为不同。假设舍入的选择是在设计 IEEE 754 和 .NET 时做出的有意识的选择,我想知道选择一种舍入类型而不是另一种舍入的原因是什么。在上面的示例中,尽管有效数字少于 decimal,但 double 似乎能更好地生成数学上正确的答案。为什么 decimal 的创建者不使用相同的舍入?是否存在 decimal 的现有行为会更有利的情况?

最佳答案

测试:

int n = 3;
double dbl = 1d / n;
decimal dec = 1m / n;

Console.WriteLine("/n");
Console.WriteLine(dbl);
Console.WriteLine(dec);

Console.WriteLine("*n");
Console.WriteLine(dbl * n);
Console.WriteLine(dec * n);

结果:

/n
0.333333333333333
0.3333333333333333333333333333
*n
1
0.9999999999999999999999999999

十进制以 10 为底, double 和单精度 - 以 2 为底。cpu 中 3*0.333333333333333 之后的 double 可能是二进制重载,结果为 1。但是 3*0.3---3 以 10 为底 - 没有重载,结果 0.9---9

关于c# - 为什么是双舍入而小数不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53207629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com