.net - 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 设置为崩溃,因为我希望事情尽早中断,最好是在编译时或至少在运行时。
有谁解决了这个问题?
解决方案
这是设计使然。
M
以or为后缀的真实文字m
是 类型decimal
。例如,文字1m
、1.5m
、1e10m
和123.456M
都是 typedecimal
。该文字通过取确切值转换为decimal
值,并在必要时使用银行四舍五入四舍五入到最接近的可表示值。除非值被四舍五入或值为零(在后一种情况下,符号和比例将为0
),否则文字中明显的任何比例都会被保留。因此,文字2.900m
将被解析为带有符号0
、系数2900
和比例的小数3
。
恐怕您唯一的选择是构建一个代码分析器,它会在这样的行上标记错误。
推荐阅读
- numpy - 3D 系统的 Lyapunov 指数谱
- r - 使用 MetaboAnalystR 包时导入 .csv 文件时遇到问题
- arrays - 在C中对数组中大于n的元素进行升序排序并以降序排序
- r - seq(0, 1, length.out = 10) 对于以下输出是否正确?[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
- windows - 在互联网连接不佳的教室中安装 VSCODE 的最佳实践
- nim-lang - Nim-Lang:如何在过程中接受任意数量的参数
- javascript - 从一个数组中获取一些不同的随机元素,(每次不设置不同的变量)
- python - Subprocess.popen - 如何一次只运行一个进程
- node.js - 使用nodejs格式化对象数组
- javascript - 函数接收来自两个不同来源的参数