好的,这是我的问题。 基本上我有这个问题。
我的号码像.53999999。 如何在不使用任何数学函数的情况下将其舍入到54?
我猜我必须乘以100来缩放它,然后除以? 那样的东西?
问题在于钱。假设我有50.5399999美元,我知道如何获得50美元,但我没有如何获得美分。我可以得到.539999部分,但我不知道怎么把它拿到54美分。
答案 0 :(得分:20)
我会使用类似的东西:
BigDecimal result = new BigDecimal("50.5399999").setScale(2, BigDecimal.ROUND_HALF_UP);
Make cents with BigDecimal上有一篇名为JavaWorld的好文章,你应该看看。
答案 1 :(得分:15)
您应该使用小数或货币类型来表示金钱,而不是浮点。
答案 2 :(得分: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。
答案 3 :(得分:7)
如果您正在进行货币计算,我认为您可能正在深入研究表面上看似简单但实际上非常复杂的问题。例如,经常重复的业务逻辑决策导致的舍入方法会极大地影响计算总数。
如果这是家庭作业,向老师展示你已经考虑过现实世界的问题,而不是只是将一堆代码挂在一起“工作” - 肯定会更令人印象深刻。
另外,我最初建议在源代码中查看Java数学方法的实现,所以我看了一下。我注意到Java正在使用本机方法来进行舍入方法 - 就像它应该的那样。
然而,看看BigDecimal显示Java中有可用于舍入的Java源代码。因此,我建议您在Java源代码中查看BigDecimal私有方法doRound(MathContext mc),而不仅仅是为您提供作业代码。
答案 4 :(得分:6)
为什么你不想使用任何数学函数?
static long round(double a)
- 返回与参数最接近的长度。
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html
为了代表金钱,我会采取以下建议,而不是重新发明轮子:
答案 5 :(得分:3)
尝试将您的货币存储为美分数(您可以将其抽象为基本货币单位数)。
编辑:由于这是作业,您可能无法控制类型。将此视为未来项目的一课
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);
答案 6 :(得分: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
。
答案 7 :(得分:0)
肖恩似乎拥有它,但是,如果你想强制执行适当的规则,那么你可能想要抛出if语句:
double value = .539999;
int result = (int) (value*100);
if(((value*100)%result)>.5)
result++;
答案 8 :(得分:0)
我建议您使用long来舍入double值。这对于小数字来说无关紧要,但可能会有所作为。
double d = 50.539999;
long cents = (long)(d * 100 + 0.5);
double rounded = cents/100;
答案 9 :(得分:-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
。