vb.net - VB.Net中的Math.Round()有什么问题?

标签 vb.net

我在VB.Net中的Math.Round函数中遇到了一个奇怪的情况

Math.Round((32.625), 2)


结果:32.62

Math.Round((32.635), 2)


结果:32.64

我需要32.63,但是在这种情况下,该函数在不同的逻辑下工作。

我可以得到小数部分,然后做我想做的事情。但这不是太怪异了,一个是四舍五入,一个是四舍五入。

那么如何从32.625中获得32.63而又不弄乱小数部分呢? (作为数学的自然逻辑)

最佳答案

Math.Round默认使用银行家的四舍五入。您可以通过指定其他MidPointRounding选项来更改它。从MSDN

四舍五入


中点值四舍五入到零以外的下一个数字。对于
例如,3.75舍入到3.8,3.85舍入到3.9,-3.75舍入到-3.8,
-3.85四舍五入到-3.9。这种舍入形式由
MidpointRounding.AwayFromZero枚举成员。四舍五入
零是最广为人知的舍入形式。


四舍五入到最接近的值或银行的四舍五入


中点值四舍五入到最接近的偶数。例如,
3.75和3.85均四舍五入至3.8,-3.75和-3.85均四舍五入
-3.8。这种舍入形式由MidpointRounding.ToEven枚举成员表示。

四舍五入到最接近是金融中使用的标准舍入形式
和统计操作。符合IEEE标准754,第
4.当在多个舍入运算中使用时,它减少了由于始终舍入中点值而导致的舍入误差。
单向。在某些情况下,此舍入误差可能是
重大。


因此,您想要的是:

Math.Round(32.625, 2, MidpointRounding.AwayFromZero)
Math.Round(32.635, 2, MidpointRounding.AwayFromZero)


正如其他人提到的那样,如果精度很重要,则应使用Decimal变量而不是浮点类型。例如:

Math.Round(32.625D, 2, MidpointRounding.AwayFromZero)
Math.Round(32.635D, 2, MidpointRounding.AwayFromZero)

关于vb.net - VB.Net中的Math.Round()有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14835001/

相关文章:

c# - 下载的 dll 中显示错误

asp.net - 使用 VB.NET 发送 HTTP 命令

c# - 从 VB.NET 转换为 C# - 未正确返回值

vb.net - 自动旋转画中画框

c# - 从 SSIS 脚本任务创建对自定义程序集的引用 - vb

c# - 在 sql 查询中使用 .net Datetime

vb.net - 验证 vb.net 中的文本框

javascript - 如何解析 vb.net 中用一堆 document.write 编写的网页?

asp.net - 如何在没有代码隐藏文件的 VB.NET aspx 页面中打开 Option Strict/Infer?

sql - VB.Net/Access SQL插入子查询问题