代码之家  ›  专栏  ›  技术社区  ›  Kelly Beard

istringstream四舍五入到最接近的美元[副本]

  •  0
  • Kelly Beard  · 技术社区  · 6 年前

    我一直被告知 从未 代表金钱 double float 这一次我向你提出一个问题:为什么?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Chris Tsang    5 年前

    因为浮点数和双倍数不能准确地表示我们用于货币的10倍基数。这个问题不仅仅针对Java,还针对任何使用基2浮点类型的编程语言。

    -2 (整数乘以10的幂)。 IEEE-754 floating-point numbers 它们是不同的,但是考虑它们的一个非常简单的方法是乘以二的幂。例如,你可以看到164*2 (整数乘以二的幂),也等于10.25。这不是数字在内存中的表示方式,但数学含义是相同的。

    即使以10为基数,这个符号也不能准确地表示最简单的分数。例如,您不能表示1/3:十进制表示法是重复的(0.3333…),因此没有可以乘以10的幂得到1/3的有限整数。你可以选择一个3的长序列和一个小指数,比如333*10 -10

    然而,为了计算货币,至少对于货币价值在美元数量级以内的国家来说,通常你所需要的只是能够存储10的倍数 -2 ,所以1/3不能表示并不重要。

    绝大多数 像金钱一样的数字,没有一个整数乘以2的幂的精确表示。事实上,0到1之间的0.01的倍数(在处理货币时非常重要,因为它们是整数美分)可以精确地表示为IEEE-754二进制浮点数,它们是0、0.25、0.5、0.75和1。其他的都少了一点。与0.333333示例类似,如果将浮点值取为0.1,然后将其乘以10,则得不到1。

    double float

    一个几乎适用于任何语言的解决方案是使用整数代替,并计算美分。例如,1025美元等于10.25美元。一些语言还内置了处理金钱的类型。其中,Java具有 BigDecimal 类,C#具有 decimal 类型。

        2
  •  -1
  •   RollerSimmer    5 年前

    这个 float double 类型是 特别不适合货币政策 十的负幂)作为 双重的 确切地。

    你花了42美分。你要多少钱 你走了?

    System.out.println(1.03 - .42);
    

    打印输出 0.6100000000000001

    使用 BigDecimal , int long 用于货币计算。

    不过 大十进制