gpt4 book ai didi

c# - C# 中的实数舍入不一致

转载 作者:行者123 更新时间:2023-11-30 13:13:09 28 4
gpt4 key购买 nike

我有这个测试代码:

class Test
{
static void Main()
{
decimal m = 1M / 6M;
double d = 1.0 / 6.0;

decimal notQuiteWholeM = m + m + m + m + m + m; // 1.0000000000000000000000000002M
double notQuiteWholeD = d + d + d + d + d + d; // 0.99999999999999989

Console.WriteLine(notQuiteWholeM); // Prints: 1.0000000000000000000000000002
Console.WriteLine(notQuiteWholeD); // Prints: 1.

Console.WriteLine(notQuiteWholeM == 1M); // False
Console.WriteLine(notQuiteWholeD < 1.0); // Prints: True. Why?

Console.ReadKey();
}
}

为什么这行打印 1?

Console.WriteLine(notQuiteWholeD); // Prints: 1

这个,为什么打印 True?

Test class output

是否有自动舍入过程?我该怎么做才能打印出正确/计算出的值?

[注意:我在 C# 5.0 in a Nutsheel 第 30 页:实数舍入错误] 中找到了这个示例代码。

提前致谢。

最佳答案

不像其他两个答案那样阅读您的问题。要点:C# 中 double 的格式化字符串表示是否为“round”?

是的。

在内部 double 以完整的 IEEE-754 十进制数字精度(15-17 位数字)表示,这就是为什么:

notQuiteWholeD < 1.0 == true    // because notQuiteWholeD = 0.99999999999999989

但是,当将其格式化为字符串时,默认情况下它将使用 15 位精度 - 相当于:

String.Format("{0:G15}", notQuiteWholeD)   // outputs "1"

要获取完整内部表示的所有数字,您可以使用:

Console.WriteLine("{0:G17}", notQuiteWholeD);

或者:

Console.WriteLine("{0:R}", notQuiteWholeD);

在这种情况下,两者都将输出“0,99999999999999989”。

前者将始终使用 17 位精度。后者(“往返精度”)将使用 15 位数字,如果它的精度足以满足以下条件,否则它将使用 17:

Double.Parse(String.Format("{0:G15}", notQuiteWholeD)) == notQuiteWholeD

奖励示例:... 当 G17R 不同时:

Console.WriteLine("{0:G17}", 1.0000000000000699); // outputs "1.0000000000000699"
Console.WriteLine("{0:R}", 1.0000000000000699); // outputs "1.00000000000007"

1.0000000000000699(17 位有效数字)仅使用 15 位有效数字就可以足够准确地表示往返。换句话说,1.00...07double 表示与 1.00...0699 相同。

因此 1.00...07(15 位)是一个较短的输入,以获得完全相同的内部(17 位)表示。这意味着 R 会将其四舍五入为 15 位数字,而 G17 将保留内部表示的所有数字。

当意识到这一点时,也许会更清楚:

Console.WriteLine("{0:G17}", 1.00000000000007); // outputs "1.0000000000000699"
Console.WriteLine("{0:R}", 1.00000000000007); // outputs "1.00000000000007"

...给出完全相同的结果。

关于c# - C# 中的实数舍入不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18091993/

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