.NET Decimal 类型截断和舍入行为

.NET Decimal type truncation and rounding behavior

.NET Framework Decimal 类型值 99999999999.999945999 截断为 99999999999.9999。

将十进制值增加到 99999999999.999946999 舍入到 100000000000。请解释该行为以及为什么发生舍入而不是截断?

为什么截断或舍入?什么不保留precision/scale99999999999.999945999或9999999999.999946999?

小数d1 =新小数(99999999999.999945999); 小数 d2 = 新小数 (99999999999.999946999);

.NET 框架版本:4.7.2

如果您不知道这种 Decimal 类型的行为,可能会出现严重的问题,包括在通过 SqlClient 持久保存到数据库时丢失分辨率。

你的问题很有道理。这是微软做出的选择。在以 Double 作为参数的 Decimal 构造函数中。

它使用最接近的舍入将值舍入到 15 位有效数字。 即使数字超过 15 位且最低有效位为零,也会这样做。如果你想了解更多。

https://docs.microsoft.com/fr-fr/dotnet/api/system.decimal.-ctor?view=netframework-4.7.2#system-decimal-ctor(system-double)