首页 > 解决方案 > dotnet 5:十进制静默截断 - 如何使其中断?

问题描述

以下是使用 .Net 5 完成的:

编译器不允许使用以下行,因为数字超过了最大 long 值:

long value = 123456789123456789123456789123456789; // <= Not allowed by compiler

但是,编译器和运行时都允许以下行:

Decimal value = 123456789123456789.123456789123456789m; // No compile time error, no runtime error.

问题是,该值立即被截断为 123456789123456789,12345678912。所以这个值实际上是在没有任何通知的情况下改变的。

我想知道在这种情况下是否可以将 dotnet 设置为崩溃,因为我希望事情尽早中断,最好是在编译时或至少在运行时。

有谁解决了这个问题?

标签: .net.net-coredecimal

解决方案


这是设计使然。

从 C# 规范:

M以or为后缀的真实文字m是 类型decimal。例如,文字1m1.5m1e10m123.456M都是 type decimal。该文字通过取确切值转换为decimal值,并在必要时使用银行四舍五入四舍五入到最接近的可表示值。除非值被四舍五入或值为零(在后一种情况下,符号和比例将为0),否则文字中明显的任何比例都会被保留。因此,文字2.900m将被解析为带有符号0、系数2900和比例的小数3

恐怕您唯一的选择是构建一个代码分析器,它会在这样的行上标记错误。


推荐阅读