代码之家  ›  专栏  ›  技术社区  ›  Sophtware

将双倍值乘以100.0会引入舍入错误吗?

  •  7
  • Sophtware  · 技术社区  · 14 年前

    这就是我正在做的,99.999%的时间都有效:

    ((int)(customerBatch.Amount * 100.0)).ToString()
    

    Amount值是double。我正在尝试将值以便士形式写入文本文件,以便传输到服务器进行处理。数值的精度不超过两位数。

    有什么想法吗?

    8 回复  |  直到 14 年前
        1
  •  21
  •   Jesper Palm    14 年前

    你真的应该用十进制来计算货币。

    ((int)(580.55m * 100.0m)).ToString().Dump();
    
        2
  •  8
  •   Andrew Bezzub    14 年前

    你可以用 decimal 用于精确计算的值。Double是浮点数,在计算过程中不能保证精确。

        3
  •  4
  •   Donald Miner    14 年前

        4
  •  3
  •   ULysses    14 年前

    尝试

    ((int)(Math.Round(customerBatch.Amount * 100.0))).ToString()
        5
  •  0
  •   Justin Ethier    14 年前

    您确实不应该使用双精度值来表示货币,因为会出现这样的舍入错误。

    580.55 作为价值 58055

        6
  •  0
  •   yatagarasu    14 年前

    不,相乘不会引入舍入误差 x、 55是其中之一)

        7
  •  0
  •   jdot    14 年前
        8
  •  0
  •   murgatroid99 dhg    13 年前

    我的建议是将该值存储为整数形式的便士,然后取 dollars_part = pennies / 100 cents_part = pennies % 100 . 这将完全避免舍入错误。

    编辑:

    编辑2: 正如其他人所指出的,最好使用某种定点十进制变量。这比我原来的解决方案要好,因为它将小数点的位置信息存储在它所属的值中,而不是存储在代码中。