【问题标题】:.NET trouble when using doubles使用双打时的 .NET 问题
【发布时间】:2011-03-08 04:09:30
【问题描述】:

在 .NET 中,当我从 1.35072 中减去 1.35 时,它显示 .000719999999。使用double 时如何获得 .00072?

TOTKILO.Text = KILO.Text * TOUCH.Text * 0.01;    //here 1.35072
TextBox10.Text = TextBox9.Text * TextBox8.Text * 0.01; //here 1.35
K = Val(TOTKILO.Text) - Val(TextBox10.Text);  //here it shows 0.00719999

【问题讨论】:

  • 您的问题非常不清楚 - 请您尝试编辑您的问题,以便更容易理解您正在尝试做什么以及遇到的问题。
  • @eldarerathis 你应该得到奖牌什么的!
  • @Kragen:如果他们正在分发,我很乐意接受,但前提是我也能站在一个漂亮的讲台上。
  • 哈,哇,刚刚查看了@eldarerathis 的强大编辑...我希望你能支持编辑!
  • 哇,eldarerathis 的编辑真的拯救了这个问题。进行最后的重新开放投票...

标签: .net floating-accuracy


【解决方案1】:

取决于你的真正要求。

如果你想四舍五入到小数点后五位,你可以这样做:

double x = 1.35072;
double y = 1.35;
double z = Math.Round(x - y, 5); // 0.00072

另一方面,如果您的目标是始终通过加/减十进制数获得精确的结果,请使用 decimal 类型而不是 double,因为它本质上是 base-10 类型(而不是base-2 类型),因此可以精确地表示以十进制形式表示的数字。

decimal x = 1.35072M;
decimal y = 1.35M;
decimal z = x - y; // 0.00072M

【讨论】:

    【解决方案2】:

    据我所知,您几乎从不需要double。几乎所有时候,decimal (System.Decimal) 都能满足您的需求,它是一个精确的数字,而不是浮点表示,因此您永远不会遇到这些舍入问题。

    【讨论】:

    • 从来没有舍入问题?那么1M - (1M / 3M) 会给我一个准确的结果吗? (只是让你很难过;))
    【解决方案3】:

    双精度数和浮点数总是以不同程度的精度表示,而不是我们想象的那样。始终将值四舍五入到小数点后,然后检查答案。

    更多细节在How To Work Around Floating-Point Accuracy/Comparison Problems中。

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多