Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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中,为了钱,应该使用什么舍入方法?_Java_Rounding_Currency - Fatal编程技术网

在Java中,为了钱,应该使用什么舍入方法?

在Java中,为了钱,应该使用什么舍入方法?,java,rounding,currency,Java,Rounding,Currency,假设Java中有一个表示货币的十进制值 对这些值进行舍入的最佳方法是什么 例如,如果我有一个基于税率计算的值,结果是,5.399999999995作为税额,我是否应该简单地将其四舍五入到小数点后2位: double d = 5.3999999999999995 BigDecimal bd = new BigDecimal(d).setScale(2, RoundingMode.HALF_EVEN); d = bd.doubleValue(); 要生成货币值,请执行以下操作: 5.40 通常使

假设Java中有一个表示货币的十进制值

对这些值进行舍入的最佳方法是什么

例如,如果我有一个基于税率计算的值,结果是,
5.399999999995
作为税额,我是否应该简单地将其四舍五入到小数点后2位:

double d = 5.3999999999999995
BigDecimal bd = new BigDecimal(d).setScale(2, RoundingMode.HALF_EVEN);
d = bd.doubleValue();
要生成货币值,请执行以下操作:

5.40

通常使用“四舍五入到偶数”规则(也称为“银行家四舍五入”)对货币进行四舍五入。该规则表示,通过选择最接近的偶数位数来打破关系。这可以消除正数和负数四舍五入中的偏差。(这不是唯一具有此特性的舍入规则,但在处理金钱时,它是一个很好的特性。)


我认为这个规则在标准API中不可用,尽管编码并不困难。

大多数计算货币的应用程序都不使用浮点(
double
float
);他们使用整数表示较小的单位。例如,在美元中,货币可以用1/100美元的便士表示


为了获得更高的精度,您可能需要一个表示1E-03(“百万美元”)或1E-06的整数。这取决于利息计算和您的精度级别等问题。

我同意@Laurent Pireyn的观点,即您应该根据合同进行四舍五入。例如,将您四舍五入到最接近的美元。他们说

你可以四舍五入到整数 在你的报税表上加美元。如果你这样做了 圆到整美元,你必须圆 所有金额。若要取整,请删除金额 低于50美分并增加金额 从50美分到99美分 美元。例如,1.39美元变成1美元 2.50美元变成3美元

很好地使用了
RoundingMode.HALF_甚至
。这样就不需要编写和测试函数了


如果这实际上是美国国税局的税率,我认为
取整模式。向上取整
是正确的。

您已经在使用
BigDecimal
进行取整,您已经在使用非常适合金融应用的取整模式,除非有具体要求或法规禁止不同的取整模式


你必须做的唯一一件事就是迈出最后一步,在整个应用程序中使用
bigdecime
来表示货币值。这正是它的用途,它比
double
更适合于这项任务,因为它可以准确地表示小数点。

用于对va进行四舍五入的精确公式lues通常在具有一定法律效力的合同中指定。然而,你永远不应该使用
double
s来表示金额。我明白了。你为什么不应该使用
double
s?
Float
s更好?我认为精度更高而不是更低-因此使用
double
s更好尽可能多。但我很高兴被纠正。浮动不是办法either@Woot4Moo:有什么特别的原因吗?@Woot4Moo:计算机可以很好地表示分数,而浮点数正好可以。只有当人们在使用二进制格式时预期小数的行为时,问题才会出现。当出现问题时,没有人会感到惊讶这条规则在标准API中非常有用——事实上有两次:我在上面的例子中使用的是“从一半到一半”规则,并且可以简单地使用上面的代码来进行“银行取整”,这是正确的吗"?@Michael-谢谢。我应该把文档翻得更深一点。用浮点数表示货币不好吗?我想这正是浮点数的用途?请随意纠正我-我真的不知道。是的,用浮点数表示货币不好。不,浮点数不是用来表示货币的。我认为科学公司计算与此有着更大的关系。浮点给你3.4444美元,很难兑现+1,因为不使用浮点或双精度作为货币。最好使用整数,把美元想象成美分。整数只是一个讨厌的黑客,当你没有像BigDecimal这样的东西时——讽刺的是,Tom已经在使用它了,而不是com完全。