12

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

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

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


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

4

10 回答 10

20

我会使用类似的东西:

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

JavaWorld上有一篇名为Make cents with BigDecimal的精彩文章,您应该看看。

于 2009-02-07T01:19:19.103 回答
16

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

于 2009-02-07T01:16:30.140 回答
8

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

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

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

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

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

于 2009-02-07T10:14:57.777 回答
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 是四舍五入到最接近的整数美分。如果您总是希望它向上取整,请将其更改为添加 0.9999999 而不是 0.5。

于 2009-02-07T01:30:38.863 回答
6

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

static long round(double a) 

- 返回最接近参数的 long。

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

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

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

于 2009-02-07T01:07:50.250 回答
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);
于 2009-02-19T21:07:36.713 回答
1

您需要将数字设为 0.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在这种情况下为 0.535。如果num大于或等于compare_num,则向上取整int_num + 1。否则简单地向下舍入int_num

于 2009-02-07T01:24:45.647 回答
0

我建议您使用 long 来舍入一个 double 值。对小数字没关系,但可能会有所作为。

double d = 50.539999;
long cents = (long)(d * 100 + 0.5);
double rounded = cents/100;
于 2009-02-07T09:17:31.697 回答
0

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

double value = .539999;
int result = (int) (value*100);
if(((value*100)%result)>.5)
    result++;
于 2009-02-07T01:16:58.283 回答
-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.

于 2009-02-07T01:10:25.300 回答