【问题标题】:C# issue with double number [duplicate]双数的C#问题[重复]
【发布时间】:2013-09-07 20:02:04
【问题描述】:

我在 C# 中使用双数时遇到了一个奇怪的问题。 NET 这是我的测试:

double my_value = 0.49;

问题是显示的变量值改为 0.48999999999999999 我不需要使用 Math.Round() 函数显示 0.49;我需要准确地存储这个值。

谢谢。

【问题讨论】:

  • 总是有用的链接...pages.cs.wisc.edu/~rkennedy/exact-float
  • 如果您查看链接问题中的答案,最好使用Decimal 类型。但是,请注意! Double 可能“看起来”很糟糕,但如果您使用该值进行大量计算,它会更加精确。但是,如果您只是简单地存储它或使用它进行简单的加/减计算,那么 Decimal 将为您提供很好的服务。
  • @BinaryWorrier - 取决于什么样的计算。例如在财务计算中,使用 double 将是一个可怕的错误。对于物理计算,double 是完美的,而 decimal 是错误的。
  • @BinaryWorrier - 我需要存储商品价格以进行贝宝结帐,在另一个网站上我不必处理小数,因此回收了代码并发现了该错误。我不需要做任何计算,所以我猜小数是我传递价格的选择。
  • @Corak:取决于财务计算的类型。多年来,我为精算师编写了预测软件,将保险/保险政策累积了数十年。在预计的学期结束之前,对这些值进行了数十万次计算。开始时的小舍入误差可能会导致最终出现较大的差异。使用十进制类型会使最终数字毫无意义。不幸的是,一种尺寸并不适合所有人:)

标签: c# .net double rounding


【解决方案1】:

欢迎使用浮点精度。如果您想要更多精度,请使用decimal 类型。

decimal my_value = 0.49m;

如果您想详细了解为什么会这样,我建议您阅读这篇文章 - What Every Computer Scientist Should Know About Floating-Point Arithmetic

【讨论】:

  • 小数不是固定精度,因为小数点的数量和位置是在数字内编码的。只是 Decimal 类型比 Float 或 Double 精度更高。
  • @RoadWarrior 当然你是对的,我已经更新了。
【解决方案2】:
【解决方案3】:

当您需要使用精确值时,不要使用double 类型。那就是decimal类型的域

decimal my_value = 0.49m;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2020-01-06
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多