【问题标题】:Convert from double to string without rounding in C#在 C# 中从双精度转换为字符串而不进行舍入
【发布时间】:2015-02-22 14:20:17
【问题描述】:

我们遇到了一个问题,即使用 .toString() 方法对双精度值进行四舍五入,以便在 TextBox 中显示。

我们需要的是这样的:

双值:39621443.8975101998

字符串值:39621443.8975101998

但我们得到的是:

双值:39621443.8975101998

字符串值:39621443.8975102

我们已经用谷歌搜索并尝试了很多方法,但都没有奏效

任何帮助将不胜感激

【问题讨论】:

  • 它最终会被四舍五入,否则它是一个可能有无限位数的数字。问题是你想要多少位数?
  • 其实位数是不可预测的,从1到10甚至更​​多位数不等
  • 请出示您的代码。
  • 到目前为止,我们已经尝试过定点,但正如 msdn 所说,它会导致舍入值:1234.567(“F”,en-US)-> 1234.57。但是我们需要没有任何四舍五入的确切值。我们甚至尝试过 ("R") 格式说明符,但还是没有得到想要的结果
  • Double 的精度有限。它只是不能代表你想要的尽可能多的数字。 39621443.897510198==39621443.897510204 这个条件实际上是真的。

标签: c#


【解决方案1】:

如果您想要具有那么多小数的精确值,您应该使用Decimal 数据类型,它比double 具有更高的精度。使用decimal.Parse(str)

【讨论】:

    【解决方案2】:

    正如@PetSerAl 指出的那样,这两个值(表示为IEEE 754 double precision floating point number)是相同的。

    39621443.8975101998 => 0x4182E49A1F2E19D4
    
    39621443.8975102 => 0x4182E49A1F2E19D4
    
    39621443.897510199800000123456789 => 0x4182E49A1F2E19D4
    

    来源:BinaryConvert.net

    RoundTrip 在这里帮不了你 - 这是双精度的限制

    您将需要另一种数据类型,就像 @magnus 建议的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多