如何在Java中舍入货币值?

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

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

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


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

我会使用类似的东西:

BigDecimal result = new BigDecimal("50.5399999").setScale(2, BigDecimal.ROUND_HALF_UP); 

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

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

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

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

  • 我建议查看Java Currency类以获取货币格式
  • 另外看一下这个用java 表示钱的页面可能会有所帮助。

如果这是家庭作业,向老师展示你已经考虑过现实世界的问题,而不是只是将一堆代码挂在一起“有效” – 肯定会更令人印象深刻。

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

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

如果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); 

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

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

 static long round(double a) 

– 回归最接近争论的时间。

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

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

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

尝试将您的货币存储为美分数(您可以将其抽象为基本货币单位的数量)。

编辑:由于这是作业,您可能无法控制类型。 考虑这是未来项目的一个教训

 long money = 5054; long cents = money % 100; long dollars = money / 100; // this works due to integer/long truncation System.out.printf("$%d.%02.d", dollars, cents); 

您需要输入数字.535并将其与原始数字进行比较,看看您是否向上或向下。 以下是从.53999999获得.535的方法(适用于任何数字):

 num = .53999999; int_num = (int)(num * 100); // cast to integer, however you do it in Java compare_num = (int_num + 0.5) / 100; 

在这种情况下, compare_num将是.535。 如果num大于或等于compare_num ,则向上舍入为int_num + 1 。 否则简单地向下舍入到int_num

肖恩似乎拥有它,但是,如果你想强加适当的规则,那么你可能想要抛出if语句,如下所示:

 double value = .539999; int result = (int) (value*100); if(((value*100)%result)>.5) result++; 

我建议你使用long来舍入double值。 这对于少数人来说无关紧要,但可能会有所作为。

 double d = 50.539999; long cents = (long)(d * 100 + 0.5); double rounded = cents/100; 

你究竟想做什么? 你总是试着去两位数吗? 或者你总是试图在最后解决像99999这样的问题?

根据评论,它实际上是前者:四舍五入到美元和美分。 所以确实只是round(100*a)/100就是你想要的。 (后者会复杂得多……)

最后,如果您只想提取美分​​部分,以下内容将起作用:

 dollars_and_cents = round(100*a)/100 cents = (dollars_and_cents-(int)dollars_and_cents)*100 

(或者java只有frac吗?在这种情况下,最后一行只是frac(dollars_and_cents)*100