Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java舍入问题_Java - Fatal编程技术网

Java舍入问题

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

我使用以下代码对作为输入的浮点值进行四舍五入。但我做不好。如果我给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.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