Java舍入问题
我使用以下代码对作为输入的浮点值进行四舍五入。但我做不好。如果我给80美元,我应该得到80.00美元,如果我给40.009889美元,我应该得到40.01美元。我该怎么做 public class round { public static float round_this(float num) { //float num = 2.954165f; float round = Round(num,2); return round; } private static float Round(float Rval, int Rpl) { float p = (float)Math.pow(10,Rpl); Rval = Rval * p; float tmp = Math.round(Rval); return (float)tmp/p; } }Java舍入问题,java,Java,我使用以下代码对作为输入的浮点值进行四舍五入。但我做不好。如果我给80美元,我应该得到80.00美元,如果我给40.009889美元,我应该得到40.01美元。我该怎么做 public class round { public static float round_this(float num) { //float num = 2.954165f; float round = Round(num,2); return round; } private static
这就是为什么你不使用浮动来赚钱,因为你陷入了“垃圾输入,数据输出”的游戏。改用java.math.BigDecimal。BigDecimal允许您指定一个不受表示问题影响的固定十进制值 当我说不要使用包含双精度的浮动时,这是同一个问题 这里有一个例子。我创建了两个大的十进制数。对于第一个,我使用接受浮点数的构造函数。对于第一个,我使用接受字符串的构造函数。在这两种情况下,BigDecimal向我显示了它所包含的数字:
groovy:000> f = new BigDecimal(1.01)
===> 1.0100000000000000088817841970012523233890533447265625
groovy:000> d = new BigDecimal("1.01")
===> 1.01
请参阅以获取更多解释,还有另一个问题。这样就可以了
public static void main(String[] args) {
double d = 12.349678;
int r = (int) Math.round(d*100);
double f = r / 100.0;
System.out.println(f);
}
你可以简化这个方法,这很容易理解,这就是为什么我写这样的文章的原因:
为什么我的数字,比如0.1+0.2
加起来就是一个漂亮的0.3轮,然后
相反,我得到了一个奇怪的结果,比如
300000000004
因为在内部,计算机使用
格式化二进制浮点
不能准确地表示一个数字
比如0.1、0.2或0.3
当代码被编译或
已解释,您的“0.1”已
四舍五入到该表中最接近的数字
格式,这将导致
舍入误差甚至在
计算发生了
使用而不是浮动
并使用如下Java代码:
BigDecimal bd = new BigDecimal(floatVal);
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
我不会使用float,我建议使用double、int或long,或者如果必须使用BigDecimal
印刷品
2.95
@Ankit:它使用double而不是float,这对货币来说仍然不合适。@Jon Skeet,但根据我的经验,double是大多数投资银行使用的。@Ankit:嗯,不。能够准确地表示10.01这样的值很有用。。。哪个替身不行。这就是为什么首选BigDecimal。@Ankit:这段代码的错误在于它不起作用。它不能工作。01不能用双精度表示,因此它不可能返回该值。试试看。而double在“钱的问题上”是完全无用的。确切地说。。。查看相关列表中的任何内容------>
double num = 2.954165;
double round = round(num, 2);
System.out.println(round);
2.95