如何在Java中汇总货币值?

9 java currency rounding

好的,这是我的问题.基本上我有这个问题.

我有一个像.53999999的号码.如何在不使用任何数学函数的情况下将其四舍五入到54?

我猜我必须乘以100来缩放它,然后除以?那样的东西?


问题在于钱.假设我有50.5399999美元,我知道如何获得50美元,但我没有如何获得美分.我可以获得.539999部分,但我不知道如何将它达到54美分.

cgr*_*eno 20

我会使用类似的东西:

BigDecimal result = new BigDecimal("50.5399999").setScale(2, BigDecimal.ROUND_HALF_UP);
Run Code Online (Sandbox Code Playgroud)

JavaWorld上有一篇名为Make cents with BigDecimal的文章,你应该看看.


rec*_*ive 15

您应该使用小数或货币类型来表示货币,而不是浮点数.

  • 这个很重要!永远不要使用浮点数来赚钱!糟糕的事情_will_会发生! (4认同)

Bil*_*ard 7

如果50.54不能以双精度表示,那么舍入将无济于事.

如果您尝试将50.53999999转换为整数美元和整数美分,请执行以下操作:

double d = 50.539999; // or however many 9's, it doesn't matter
int dollars = (int)d;
double frac = d - dollars;
int cents = (int)((frac * 100) + 0.5);
Run Code Online (Sandbox Code Playgroud)

请注意,在最后一步中添加0.5是为了舍入到最接近的整数分数.如果您总是希望它向上舍入,请将其更改为0.9999999而不是0.5.


Eli*_*jah 7

数学与金钱比大多数工程师想象的更复杂(过于概括)

如果您正在进行货币计算,我认为您可能正在深入研究表面看似简单但实际上非常复杂的问题.例如,由于经常重复的业务逻辑决策而导致的舍入方法可能会极大地影响计算总数.

如果这是家庭作业,向老师展示你已经考虑过现实世界的问题,而不是只是把一堆代码放在一起"工作" - 肯定会更令人印象深刻.

另外,我最初建议在源代码中查看Java数学方法的实现,所以我看了一下.我注意到Java正在使用本机方法来进行舍入方法 - 就像它应该的那样.

但是,看看BigDecimal显示Java中有可用于舍入的Java源代码.因此,我建议您在Java源代码中查看BigDecimal私有方法doRound(MathContext mc),而不仅仅是为您提供作业代码.


Chr*_*nce 6

你为什么不想使用任何数学函数?

static long round(double a) 
Run Code Online (Sandbox Code Playgroud)

- 回归最接近争论的时间.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html

为了代表钱,我会采取以下建议,而不是重新发明轮子:

http://www.javapractices.com/topic/TopicAction.do?Id=13