.net - 需要帮助四舍五入到小数点后两位

标签 .net vb.net math-functions

为什么当我执行以下操作时...

Math.Round(0.75, 1, MidpointRounding.AwayFromZero)

我得到0.8

但是当我执行以下操作时...
Math.Round(0.575, 2, MidpointRounding.AwayFromZero)

我没有得到0.58。相反,我得到0.57。我想要的是5以上的值,因此0.575应该是0.58。

最佳答案

问题是您不能精确地将0.575表示为二进制浮点数(例如, double 数)。尽管我不清楚,但最接近的表示形式似乎可能要低一些,因此在四舍五入时会使用真实的表示形式并向下取整。

如果要避免此问题,请使用更合适的数据类型。 decimal将执行您想要的操作:

Math.Round(0.575M, 2, MidpointRounding.AwayFromZero)

结果:0.58
0.75做正确的事情的原因是它很容易用二进制浮点表示,因为它是简单的1/2 + 1/4(即2 ^ -1 + 2 ^ -2)。通常,任何二的幂的有限和都可以用二进制浮点表示。异常(exception)是当您的2的幂跨度太大时(例如2 ^ 100 + 2不能精确表示)。

编辑添加:

Formatting doubles for output in C#可能对理解为什么很难理解0.575不是0.575感兴趣。接受的答案中的DoubleConverter将显示0.575作为精确字符串是0.5749999999999999555910790149937383830547332763671875您可以从中看到为什么舍入给出0.57。

关于.net - 需要帮助四舍五入到小数点后两位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12113096/

相关文章:

c# - unity c# Mathf.FloorToInt(-0.5) 返回 0 (作用类似于 Mathf.CielToInt)

sql - POWER 不会反转 LOG,反之亦然

.net - 我的app.config文件出了什么问题?

asp.net - 如何在aspx页面中使用Request.QueryString?

vb.net - 仅从字符串中获取数字

vb.net - 如何在单独的线程上运行 VB 项目中的表单,同时仍能够进行通信

c# - 永久服务 "Starting"状态

c# - 从 EF 的两个实体构建字典

c# - 调试时隐藏 DLL 中的代码