如何将 Decimal 值四舍五入到一个精度,以便总位数不超过 15?

How can I round a Decimal value upto a precision so that the total number of digits doesnot cross 15?

我需要将 25979.699999999997 这样的值四舍五入到 15 位,这样它就变成 25979.7 并且不包含任何无关紧要的零。

背景: 我正在尝试使用 OpenXML SDK 解析 excel 文件,并且有一个十进制值(例如 25979.7)被读取为 25979.699999999997.

当 MS excel 显示该值时,它总是将它们四舍五入为 15 位数字并删除尾随零,因此它变成 25979.7,但是当我使用 OpenXML SDK 阅读时它不会自动这样做。

有什么想法吗?

编辑:实际上我不想修改该值,只想显示那种格式(作为字符串)。

嗯,你可以试试不那么复杂的数学:

var x = 25979.699999999997;
var y = Math.Round(x, 15 - (int)Math.Floor(Math.Log10(x) + 1));

y 将正好是 25979.7

这里我们计算小数点前的位数为

Math.Floor(Math.Log10(x) + 1)

并从 15 中减去它得到剩余的小数位数。

只需格式化您的(未修改的)值即可获得格式良好的字符串:

double val = double.Parse("25979.699999999997");
string formatted = val.ToString("g");

g 格式化将为您完成所有工作。