Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在某些情况下,BigDecimal是一种过度杀伤力吗?_Java_Floating Point_Bigdecimal - Fatal编程技术网

Java 在某些情况下,BigDecimal是一种过度杀伤力吗?

Java 在某些情况下,BigDecimal是一种过度杀伤力吗?,java,floating-point,bigdecimal,Java,Floating Point,Bigdecimal,我用的是钱,所以我需要我的结果是准确的,但我只需要2个小数点(美分)的精度。是否需要BigDecimal来保证乘法/除法的结果是准确的?一个常见的选项是使用整数或long(美分值)进行所有计算,然后在需要显示时只需添加两位小数 类似地,还有一个库可以为您提供功能更全面的货币计算API。这取决于您的应用程序。使用该精度级别的一个原因是防止在许多操作中累积的错误渗透并导致有价值信息的丢失。如果您正在创建一个临时应用程序和/或仅将其用于(比如)数据输入,则BigDecimal很可能是一种过度使用。Bi

我用的是钱,所以我需要我的结果是准确的,但我只需要2个小数点(美分)的精度。是否需要BigDecimal来保证乘法/除法的结果是准确的?

一个常见的选项是使用整数或long(美分值)进行所有计算,然后在需要显示时只需添加两位小数


类似地,还有一个库可以为您提供功能更全面的货币计算API。

这取决于您的应用程序。使用该精度级别的一个原因是防止在许多操作中累积的错误渗透并导致有价值信息的丢失。如果您正在创建一个临时应用程序和/或仅将其用于(比如)数据输入,则BigDecimal很可能是一种过度使用。

BigDecimal是小数点后具有已知位数的十进制分数算术的非常合适的类型。您可以使用整数类型并自己跟踪乘法器,但这需要在代码工作中进行自动化

除了管理小数点后的数字外,BigDecimal还将根据需要扩展存储的位数-许多企业和政府财务计算涉及的金额太大,无法以美分存储在整数中


<>我会考虑避免它,除非你需要存储大量的钱,而且内存不足。

< p>你可以编写自己的代码<货币> /Cuff>类,使用<代码>长< /Cord>保存金额。类方法将使用
字符串设置和获取金额


无论您使用的是
long
还是
BigDecimal
,除法都是一个问题。你必须根据具体情况确定你用分数美分做什么。丢弃它们、舍入它们或保存它们(在您自己的帐户之外的某个地方)。

+1对于Patricia的答案,但我强烈建议任何人使用固定位长的整数数据类型实现自己的类,只要有人真的不知道您在做什么。BigDecimal支持所有舍入和精度问题,而long/int存在严重问题:

  • 分数位数未知:贸易交易所/法律/商业的数量不同 小数位数,因此您不知道所选位数是否必须更改和更改 在将来调整。更糟糕的是:有些东西,比如股票评估,需要大量的小数位数。一艘装载1000公吨煤的船会引起。 4.12欧元的冰成本,导致0000412欧元/吨

  • 未实现的操作:这意味着人们可能会使用浮点运算 舍入/除法或其他算术运算,隐藏不精确性并导致 所有已知的浮点运算问题

  • 溢出/下溢:达到最大金额后,添加金额会导致符号更改。Long.MAX\u值切换为Long.MIN\u值。如果你在做(a*b*c*d)/(e*f)这样的分数,这很容易发生,这可能会在一个长的范围内完全有效,但中间的命名或分母不会


但他想进行除法计算,如果使用整数计算金钱是不合适的答案,但知道这一点可能会帮助您: