C#正确有效地将double转换为十进制

时间:2017-03-31 10:27:26

标签: c# decimal rounding primitive

double转换为decimal舍入到n精度位置的最有效(且严格正确)方法是什么?

我正在使用decimal.Round((decimal)d, n, MidpointRounding.AwayFromZero),但我发现我在这里四次进行四舍五入 - 一次投降(decimal)d,一次投放Round()

有没有办法直接围绕doubledecimaln个地方?我想我可以通过琴弦往返它,但这看起来很丑陋和昂贵。

2017/5/15:我在corefx github这里添加了一个问题https://github.com/dotnet/corefx/issues/19706

3 个答案:

答案 0 :(得分:0)

如果你的双重恰好有15位有效数字,那么<script>App.data = {!! $data !!}</script>可以解决问题:

System.Convert.ToDecimal(d)

因此,你可以实现所需的舍入而不进行字符串转换或Console.WriteLine(Convert.ToDecimal(123456789012345500.12D)); // Displays 123456789012346000 Console.WriteLine(Convert.ToDecimal(123456789012346500.12D)); // Displays 123456789012346000 Console.WriteLine(Convert.ToDecimal(10030.12345678905D)); // Displays 10030.123456789 Console.WriteLine(Convert.ToDecimal(10030.12345678915D)); // Displays 10030.1234567892 ,首先添加10的合适幂(以创建前导数字并减少结果中的小数位数) )或减去最高有效数字(增加小数位数),然后调用Decimal.Round()(从而在第15位有效数字处舍入修改后的Double),最后从十进制数字中再次减去或添加前导数字。

我真的认为你的方式更好。

答案 1 :(得分:0)

您想要执行两个步骤:

  1. 转换为十进制
  2. 转到n个地方
  3. 您无法将这些步骤缩减为一个。即使有一个函数获得double numberint places作为参数,它也必须执行这两个步骤。

答案 2 :(得分:0)

我不明白的是,为什么要将double值转换为十进制值时舍入double值,因为decimal的精度比double高很多。四舍五入没有意义。

您可以简单地将双精度转换为十进制:

double doubleValue = 12.23;
decimal decimalValue = (decimal) doubleValue;

或其他人的建议:

decimalValue = Convert.ToDecimal(doubleValue);

如果你真的关心性能(我不太确定是这种情况)你应该重新考虑使用decimal而不是double,因为它既不是非常快,也不是非常高效的内存。 Double对于许多应用程序而言足够精确,您应该考虑是否需要十进制类型提供的额外精度。