如何将 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
格式化将为您完成所有工作。
我需要将 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
格式化将为您完成所有工作。