gpt4 book ai didi

c# - 在 C# 中,10m * 0.1m 等于 1m 吗?

转载 作者:行者123 更新时间:2023-12-04 00:53:55 27 4
gpt4 key购买 nike

代码片段

decimal one1 = 10m * 0.1m;
decimal one2 = 10m / 10m;
Console.WriteLine($"{one1}, {one2}, {one1 == one2}");

产生输出:

1.0, 1, True

为什么第一个数字打印有小数点而第二个数字没有。如果答案在于 decimal 类型不具有完全表示 0.1 的精度,那么为什么相等运算符返回 true?

最佳答案

float 是一个复杂的概念,由 3 个独立的部分组成,它们存储您认为是数字的信息。

此外,编译器和计算机体系结构如何处理 float 也并不明显。一般来说,这些类型的数字有一些非常奇怪的怪癖;他们如何存储精度;它们可以处理哪些数字,以及编译器和 CPU 如何对它们进行数学计算。

但是,您获得不同值的原因实际上取决于为该数字存储的内容。它们在内存中实际上不是相同的位和字节。相同的数字可以以多种不同的方式存储,并且可以通过不同类型的计算获得(如您所示)。

让我们看看

decimal one1 = 10m * 0.1m;
decimal one2 = 10m / 10m;

int[] bits = decimal.GetBits(one1);

Console.WriteLine("{0,31} {1,10:X8}{2,10:X8}{3,10:X8}{4,10:X8}", one1, bits[3], bits[2], bits[1], bits[0]);

int[] bits2 = decimal.GetBits(one2);

Console.WriteLine("{0,31} {1,10:X8}{2,10:X8}{3,10:X8}{4,10:X8}", one2, bits2[3], bits2[2], bits2[1], bits2[0]);

输出

                        1.0   00010000  00000000  00000000  0000000A
1 00000000 00000000 00000000 00000001

如您所见,它们实际上具有明显不同的二进制布局,这意味着代表同一事物的不同尾数和比例因子。

至于调用 ToString() 时额外的 0,编译器知道重要的零,它们是数字组成的一部分,并根据它们的比例保留。

幸运的是,CLR体系结构 足够智能,可以区分两者。

关于c# - 在 C# 中,10m * 0.1m 等于 1m 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64237598/

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