是否必须使用BigDecimal计算货币(Java)?

是否必须使用BigDecimal计算货币(Java)?,java,Java,PC是否有可能错误地添加2个十进制浮点数 0.13 + 0.21 =0.340000000004 如果我们把这两个数相加,我们就不会有额外的分数错误了,对吗?因为这不是逻辑,但计算机可以做到 这是电脑问题吗 如何在Java中正确使用BigDecimal?这不是强制性的,但它是一种良好的实践,至少有四个原因: 货币总额可以任意增长(假设你在一家银行工作,你不想让系统因溢出而发疯)。虽然十亿美元可能看起来是一大笔钱,但考虑到在某些货币中,十亿或甚至一兆可能不是那么多。 由于浮点近似,浮点数会受到侵

PC是否有可能错误地添加2个十进制浮点数

0.13 + 0.21 =0.340000000004
如果我们把这两个数相加,我们就不会有额外的分数错误了,对吗?因为这不是逻辑,但计算机可以做到

这是电脑问题吗


如何在Java中正确使用BigDecimal?

这不是强制性的,但它是一种良好的实践,至少有四个原因:

  • 货币总额可以任意增长(假设你在一家银行工作,你不想让系统因溢出而发疯)。虽然十亿美元可能看起来是一大笔钱,但考虑到在某些货币中,十亿或甚至一兆可能不是那么多。
  • 由于浮点近似,浮点数会受到侵蚀。仍然在银行示例中,您不想在任何交易中偷窃或送出美分,并且希望银行帐户为空,不包含
    1e-37$
  • 浮点数的精度有限。虽然这对于大多数应用程序来说是可以的,但在处理货币时,您希望跟踪从数十亿美元到美分的所有内容
  • 浮点数的状态在处理货币时毫无意义:客户存入
    NaN
    美元意味着什么

  • 长期以来,浮点运算一直是个问题。这就是为什么鼓励使用
    BigDecimal
    。对于您关于如何正确使用它的问题,我有一个简单的示例,可以帮助您了解如何与一起使用


    这是因为二进制的转换是不均匀的。与使用十进制时分数1/3变为0.33333相同

    浮点数的标准称为IEEE 754,使用32位

    这32位由以下部分组成

    • 符号=1位(0=+,1=-)
    • 指数=8位
    • 尾数=23位
    你可以通过参观来了解这一点

    因此,当将0.34(作为示例)转换为二进制时

     00111110 10101110 00010100 01111011
    
    当计算机将其转换回十进制fomrat时,结果并不完全相同:

     00111110 10101110 00010100 01111011
    
     3.400000035762786865234375E-1
    

    只需使用
    int
    ,或
    long
    ,并以美分计算,而不是美元(或任何您拥有的货币)。PC是什么意思?这是一个浮点问题…你必须知道当我们谈论浮点数时,0.13不是0.130000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,这个问题确实让很多人感到困惑people@cahen投票被否决是因为这个问题没有显示任何研究成果。在Google或Wikipedia上快速搜索已经找到答案。另请参见如何将字符串转换为BigDecimal?@Tum-BigDecimal有许多重载构造函数,这些构造函数接受几乎所有的基本数据类型,并将字符串作为参数。我编辑了答案以反映同样的情况。
     00111110 10101110 00010100 01111011
    
     3.400000035762786865234375E-1