如何在 Java 中四舍五入货币值?

问题描述 投票:0回答:10

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

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

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


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

java currency rounding
10个回答
20
投票

我会使用类似的东西:

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

JavaWorld 上有一篇很棒的文章,叫做 Make cents with BigDecimal,您应该看看。


16
投票

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


8
投票

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

如果你是做货币计算的,我想你可能正在研究表面上看起来简单但实际上相当复杂的问题。例如,作为经常重复的业务逻辑决策结果的舍入方法会极大地影响计算的总数。

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

顺便说一下,我最初打算建议查看源代码中 Java 数学方法的实现,所以我看了一下。我注意到 Java 正在为其舍入方法使用本地方法——就像它应该的那样。

但是,查看 BigDecimal 表明有 Java 源可用于 Java 中的舍入。因此,与其只给你作业代码,我建议你看看 Java 源代码中的 BigDecimal 私有方法 doRound(MathContext mc)。


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

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


6
投票

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

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


3
投票

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

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

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

1
投票

您需要将数字设为 .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
.


0
投票

Sean 似乎有它,除了,如果你想强加适当的规则,那么你可能想要像这样加入一个 if 语句:

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

0
投票

我建议你使用 long 来四舍五入一个 double 值。这对小数字无关紧要,但可能会有所作为。

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

-1
投票

你到底想做什么?你总是想达到两位数吗?还是无论如何,您总是试图在最后修复诸如 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

© www.soinside.com 2019 - 2024. All rights reserved.