c# - (276/304)*304 的小数舍入关闭

标签 c# .net types floating-point

如果将以下代码放入编译器,结果会有点奇怪:

decimal x = (276/304)*304;
double y = (276/304)*304;

Console.WriteLine("decimal x = " + x);
Console.WriteLine("double y = " + y);

结果:

decimal x = 275.99999999999999999999999

double y = 276.0

有人能给我解释一下吗?我不明白这怎么可能是正确的。

最佳答案

276/304 = 69/76 是以 10 为底和以 2 为底的循环“十进制”。

  • 小数:0.90(789473684210526315)
  • 二进制:0.11(101000011010111100)

所以结果四舍五入,乘以分母可能得不到原来的分子。这种情况的一个更常被引用的例子是 1/3*3 = 0.33333333*3 = 0.99999999。

double 版本给出了准确答案纯属巧合。乘法中的舍入误差恰好抵消了除法中的舍入误差。

如果此结果令人困惑,可能是因为您听说过“double 有舍入错误,而 decimal 是精确的”。但是 decimal 仅在表示 decimal 小数时才准确,例如 0.1(二进制为 0.0 0011 0011...)。当分母中有 19 的因数时,它对您没有帮助。

关于c# - (276/304)*304 的小数舍入关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5029955/

相关文章:

c# - DecimalUpDown 直接编辑时不显示正确的值

C#/VB.Net - 枚举路径

c# - 将程序集安装到 GAC

sql - 将表列的数据类型从时间戳更改为 bigint

C++:重载 = 运算符以创建 uint8_t 兼容数据类型

c# - 使用 <ul> 进行导航(无法记住状态)

.net - .NET 和 C++ 应用程序之间的 IPC

c# - 在 C# 中,如果类或方法未标记为密封或虚拟,那是什么?

haskell - Haskell 中的类 OO 接口(interface)实现

c# - 我可以在 Windows 照片查看器中打开图像而无需图像路径吗