c# - C#:Math Round() 为不同的小数产生不同的值
问题描述
使用不同的小数点时,我得到了不同的值Math.Round
,有人可以纠正我哪里出错了。
double r = Math.Round(1.235, 2,MidpointRounding.AwayFromZero);
double t = Math.Round(19.185, 2,MidpointRounding.AwayFromZero);
r
结果为 1.24,而t
结果为 19.18,预期结果为t
19.19。
解决方案
根据Math.Round
,来电者须知部分
由于将十进制值表示为浮点数或对浮点值执行算术运算可能导致精度损失,因此在某些情况下,该
Round(Double, Int32, MidpointRounding)
方法可能不会像mode
参数指定的那样对中点值进行四舍五入。这在以下示例中进行了说明,其中 2.135 舍入为 2.13 而不是 2.14。
这听起来像你的确切情况,由于精度损失19.185
被四舍五入19.18
而不是19.19
. G17
您可以使用格式说明符显示值以查看所有有效数字的精度
Console.WriteLine(1.235.ToString("G17"));
Console.WriteLine(19.185.ToString("G17"));
输出将是这样的
1.2350000000000001
19.184999999999999
作为可能的解决方法,您可以使用decimal
精度更高的值
var r = Math.Round(1.235m, 2, MidpointRounding.AwayFromZero);
var t = Math.Round(19.185m, 2, MidpointRounding.AwayFromZero);
结果将在意料之中
推荐阅读
- laravel - 自定义 sass 到多站点项目
- mysql - 如何在所有组合中获取逗号分隔的记录
- html - 如何使表单与 flex 对齐
- ruby-on-rails - 如何使用belong_to post和membre在db中创建一个条目评论
- javascript - 如何永久聚焦一个元素?
- c++ - 如何使用 Boost V2 1.70 日志库在第一个索引处保留最新的日志文件名(例如 logtrail01.txt)?
- swift - 从 Cloud Firestore 下载图像并添加到用户对象
- reactjs - 从父组件中的子组件访问节点元素
- d3.js - d3 dateformat 解析返回 null
- javascript - 使用其 firebaseID 获取 firebase 文档