好的,这是我的问题。 基本上,我有这个问题。
我有一个数字像.53999999。 如何将其四舍五入到54而不使用任何Math函数?
我猜我必须乘以100来缩放它,然后除以什么吗? 类似这样的东西?
问题出在钱上。假设我有50.5399999美元,我知道如何获得50美元,但我不知道如何获得美分。我可以得到.539999部分,但我不知道如何将其变为54美分。
好的,这是我的问题。 基本上,我有这个问题。
我有一个数字像.53999999。 如何将其四舍五入到54而不使用任何Math函数?
我猜我必须乘以100来缩放它,然后除以什么吗? 类似这样的东西?
问题出在钱上。假设我有50.5399999美元,我知道如何获得50美元,但我不知道如何获得美分。我可以得到.539999部分,但我不知道如何将其变为54美分。
BigDecimal result = new BigDecimal("50.5399999").setScale(2, BigDecimal.ROUND_HALF_UP);
有一篇很棒的文章叫做使用BigDecimal计算小数点,你应该去JavaWorld看看。
您应该使用十进制或货币类型来表示金钱,而不是浮点数。
如果你在进行货币计算,我认为你可能会涉及到表面上看起来简单但实际上相当复杂的问题。例如,由业务逻辑决策产生的舍入方法经常会极大地影响计算的总数。
如果这是一份作业,向老师展示你已经思考了现实世界的问题而不仅仅是把一堆代码组合在一起“运行”-肯定会更令人印象深刻。
顺便说一下,我最初想建议查看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);
static long round(double a)
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html
为了表示货币,我建议不要重复造轮子,可以采取以下建议:
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);
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++;
我建议您在将double值四舍五入时使用long。这对于小数没有影响,但可能会有所不同。
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
。)