将java BigDecimal中的6.51更改为6.50

将java BigDecimal中的6.51更改为6.50,java,decimal,bigdecimal,Java,Decimal,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)).setScal

这就是我们已经尝试过的,但是这些东西都不起作用

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得到6.51。向下我得到6.50,我已经得到了6.51的值,我需要将其更改为6.50


我想将6.51改为6.50,但这不起作用

TL;DR:使用
BigDecimal。将
四舍五入为四舍五入模式和/或使用字符串作为输入而不是双精度来创建BigDecimal

解释

比较文档。以下是您想要的:

大十进制。四舍五入半

舍入模式向“最近邻”舍入,除非两者都有 邻居之间的距离是相等的,在这种情况下,他们会聚集在一起。表现为 如果丢弃的分数为≥ 0.5; 否则,表现为 把你打倒请注意,这是我们大多数人使用的舍入模式 在小学任教

与你用过的相比

BigDecimal.ROUND_天花板(在您的情况下,其行为类似于BigDecimal.ROUND_,请参见下文)

舍入模式可向正无穷大舍入。如果大十进制是 正向,表现为向上取整;如果为负值,则表现为for 把你打倒。请注意,此舍入模式不会降低 计算值

你总是围着我转。您有一个小数位数要舍入,因为您使用double作为输入来创建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_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

双精度不是每个十进制数字都有一个完美的精度,而字符串有它。

:使用
BigDecimal。四舍五入为四舍五入模式,和/或使用字符串作为输入而不是双精度来创建一个BigDecimal

解释

比较文档。以下是您想要的:

大十进制。四舍五入半

舍入模式向“最近邻”舍入,除非两者都有 邻居之间的距离是相等的,在这种情况下,将其围起来 如果丢弃的分数为≥ 0.5;否则,其行为与 向下取整。请注意,这是我们大多数人使用的取整模式 在小学任教

与你用过的相比

BigDecimal.ROUND_天花板(在您的情况下,其行为类似于BigDecimal.ROUND_,请参见下文)

舍入模式向正无穷大舍入。如果BigDecimal为 正值,表现为向上取整;如果为负值,表现为向上取整 向下取整。请注意,这种取整模式不会降低 计算值

您总是四舍五入。并且您有一个小数位数要四舍五入,因为您使用双精度作为输入来创建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_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

双精度不是每个十进制数字都有完美的精度,而字符串有。

如果要分割金额,最好只通过乘法计算一个值,通过减法计算另一个值。在这种情况下,满足公式
total=am_user+am_me
。请勿将浮点值用作大小数的值。使用整数或字符串,例如
valueOf(int)
new BigDecimal(string)
。如果你想得到大小数所提供的准确度,就不要使用浮点。如果你想分割金额,最好只通过乘法计算一个值,通过减法计算另一个值。在这种情况下,满足公式
total=am_user+am_me
。请勿将浮点值用作大小数的值。使用整数或字符串,例如
valueOf(int)
new BigDecimal(string)
。如果你想要大小数提供的精度,请远离浮点。这是一篇关于字符串和双精度的有趣评论。我很好奇是否还有一个性能因素?字符串只提供数字,而Double似乎实际执行某种操作,将Double转换为BigDecimal,这似乎字符串速度更快。。。我想知道很多事情是否都是这样。这是一个关于字符串和双精度的有趣评论。我很好奇是否还有一个性能因素?字符串只提供数字,而Double似乎实际执行某种操作,将Double转换为BigDecimal,这似乎字符串速度更快。。。我想知道很多事情是否都是这样。