2016-04-29 51 views
0

这里就是我们所尝试,但那些事非的作品...变化6.51 6.50在Java的BigDecimal

BigDecimal Total_Discount=new BigDecimal(10.00); 
    BigDecimal Amount_To_User=new BigDecimal(00.00); 
    BigDecimal Amount_To_Me=new BigDecimal(00.00); 



    Amount_To_User=Total_Discount.multiply(new BigDecimal(0.65)).setScale(2,BigDecimal.ROUND_UP); //65% of the amount 
    Amount_To_Me=Total_Discount.multiply(new BigDecimal(0.35)).setScale(2,BigDecimal.ROUND_UP); //35% of the amount 

由65%和35分割数值,以便10将是6.50和3.50,但我正在使用BigDecimal.DOWN我得到6.50我已经有6.51,我需要改变,以6.50

Amount_To_User=Amount_To_User.setScale(2, BigDecimal.ROUND_CEILING); 
    System.out.println(Amount_To_User); //Gives the value 6.51 

我想改变这种状况6.51 6.50值越来越6.51但这并不工作

+1

如果您想分割金额,您最好只计算一个乘以乘数的值,另一个乘以总账户的相减值。在这种情况下,满足公式'total = am_user + am_me'。 – Robert

+0

请勿使用浮点值作为Bigdecimal的值。使用整数或字符串,例如'valueOf(int)'或'new BigDecimal(string)'。如果您想要BigDecimals提供的准确性,请远离浮点。 –

回答

4

TL; DR:使用BigDecimal.ROUND_HALF_UP作为舍入模式和/或使用字符串作为输入而不是double来创建BigDecimal。

Explenation

比较的文档。这里是你想要的东西:

BigDecimal.ROUND_HALF_UP

舍入模式走向“近邻”,除非双方 的距离相等,在这种情况下围捕。如果废弃部分≥0.5,则表现为 ROUND_UP;否则,表现为 ROUND_DOWN。 请注意,这是我们大多数人 在小学授课的舍入模式。

VS.你用过什么。

BigDecimal.ROUND_CEILING(在你的情况下的行为像BigDecimal.ROUND_UP,见下文)

舍入模式接近正无穷大。如果BigDecimal为 为正,则表现为ROUND_UP;如果为负值,则表现为 ROUND_DOWN。请注意,这个舍入模式永远不会减少计算值 。

你总是收起来。并且您有一个带小数点的数字,因为您使用double作为Input来创建BigDecimal(请参阅下面的示例)。

BigDecimal.ROUND_UP

入模式从零往返路程。在非零废弃分数之前,始终递增数字 。请注意,该舍入模式 绝不会降低计算值的大小。

此外,您应该从字符串输入而不是从double创建BigDecimals。对构造函数中的值使用引号"

BigDecimal total_Discount = new BigDecimal("10.00"); 
BigDecimal amount_To_User = new BigDecimal("00.00"); 
BigDecimal amount_To_Me = new BigDecimal("00.00"); 

amount_To_User = total_Discount.multiply(new BigDecimal("0.65")).setScale(2, BigDecimal.ROUND_HALF_UP); 
amount_To_Me = total_Discount.multiply(new BigDecimal("0.35")).setScale(2, BigDecimal.ROUND_HALF_UP); 
System.out.println(amount_To_User); //6.50 
System.out.println(amount_To_Me); //3.50 

这会告诉你为什么:

System.out.println(new BigDecimal(0.65)); 
//prints 0.65000000000000002220446049250313080847263336181640625 
System.out.println(new BigDecimal("0.65")); 
//prints 0.65 

绝处逢生还没有一个完美的精度在每一个十进制数,而字符串中有它。

+0

这是一个关于弦乐和双打的有趣评论。我很好奇是否还有性能因素?该字符串只是给你数字,而Double似乎实际上执行某种操作来将Double转换为BigDecimal,这看起来好像一个字符串会更快......我想知道这是否是很多事情的情况。 – XaolingBao