【发布时间】:2014-08-26 12:59:10
【问题描述】:
将“高”精度 Double 转换为 Decimal 时,由于舍入,我使用 Convert.ToDecimal 或强制转换为 (Decimal) 会丢失精度。
例子:
double d = -0.99999999999999956d;
decimal result = Convert.ToDecimal(d); // Result = -1
decimal result = (Decimal)(d); // Result = -1
Convert.ToDecimal(double) 返回的 Decimal 值最多包含 15 个有效数字。如果 value 参数包含超过 15 个有效数字,则使用舍入到最接近的方式进行舍入。
所以为了保持精度,我必须将我的双精度转换为字符串,然后调用 Convert.ToDecimal(String):
decimal result = System.Convert.ToDecimal(d.ToString("G20")); // Result = -0.99999999999999956d
此方法有效,但我想避免使用 String 变量来将 Double 转换为 Decimal 而无需在 15 位后四舍五入?
【问题讨论】:
-
您是否事先知道
d的范围?如果您知道d在 [-2..2] 之类的范围内,我可以用伪代码提供一些轻量级解决方案(我对 C# 不够熟悉,无法用 C# 编写它们) -
d 总是在 [-1,1] 之间
-
我假设这是来自其他地方的
double,您无法更改?如果从一开始就将其声明为小数 (decimal d = -0.99999999999999956m;),它将保持该精度。 -
你说得对,克里斯,我无法更改双精度值,因为它是通过另一种我无法更改的方法返回的
-
MSDN help for
Convert.ToDecimal表示“此方法返回的 Decimal 值最多包含 15 个有效数字。如果 value 参数包含超过 15 个有效数字,则使用舍入到最接近的方式进行舍入。”
标签: c# double decimal precision