代码如下,java用BigDecimal四舍五入怎么还有问题呀?哪种方式是完全没有问题的?问题描述 1.为什么不是1.51
问题描述
1.为什么不是1.51?输出的是1.50
2.decimalformat括号里的字符串代表了什么意思?有模板吗?如果是别的格式应该怎么写
3.为什么要用#号而不是0.00?如果是#好的话,当a是0.505的时候有bug
double a =1.505; BigDecimal bd = new BigDecimal(a); System.out.println(new DecimalFormat(“#.00”).format(bd));
问题解答
回答1:
首先,指出一个问题:构建 BigDecimal 的时候,尽量不要使用浮点数(double,float),因为浮点数在计算机中的存储存在精度缺失问题。比如你的写的代码:
public static void main(String[] args) throws Exception { double a = 1.505; BigDecimal bd = new BigDecimal(a); System.out.println(“bd: ” + bd.toString());}
运行结果:
可以看到,浮点数 1.505 在计算机中没法存储的 —— 具体原因如果不知道,请自行搜索 “浮点数精度缺失问题”
第二,如果需要输出 1.51,即常说的 “四舍五入”,那么需要指定 DecimalFormat 的舍入模式:
public static void main(String[] args) throws Exception { BigDecimal bd = new BigDecimal(“1.505”); System.out.println(“bd: ” + bd.toString()); DecimalFormat df = new DecimalFormat(“#.00”); df.setRoundingMode(RoundingMode.HALF_UP); System.out.println(“format: ” + df.format(bd));}
运行结果:
如果不了解 RoundingMode 的用法,请自行搜索 “RoundingMode 的用法”
第三,关于 DecimalFormat 括号里的字符串代表的意思,请自行搜索 “DecimalFormat 的用法”
回答2:
System.out.println(String.format(“%.2f”, a)); System.out.println(new Formatter().format(“%.2f”, a)); 这两种是可以的。 double d = 5.505; System.out.println(d) 输出的是1.504xxxxxxxxx,所以java在做四舍五入的时候舍掉了后面的4xxxxxx。 等待大神解答
java bigDecimal 四舍五入的bug?
浮点数精度问题,传字符串就正常了
for (double i = 511.55; i < 2050.55; i++) { BigDecimal bd = new BigDecimal(i+””);//拼成字符串 bd =bd.setScale(1, BigDecimal.ROUND_HALF_UP); System.out.println(bd.doubleValue()); }
java的BigDecimal类里的四舍五入方法怎么这么乱,到底5进位还是退位?
我来告诉你原因吧up=四舍五入down=五会舍去,大于5就入然后你程序是错的BigDecimal a = new BigDecimal(1.525); BigDecimal b = new BigDecimal(-1.525); System.out.println(a); System.out.println(b);new BigDecimal最好用string,你直接写数字的话,结果不是你想要的,以上程序,结果是:1.524999999999999911182158029987476766109466552734375-1.524999999999999911182158029987476766109466552734375浮点数是不精确的分给我吧
Java几种常见的四舍五入的方法
下面给你介绍3种常见的四舍五入:
// 方式一:BigDecimal方式
double f = 3.1315;
BigDecimal b = new BigDecimal(new Double(f).toString);
double f1 = b.setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
注意:这里一定不要直接使用new BigDecimal(double)的构造方法,而要使用new BigDecimal(new Double(1.1315).toString())的方式,不然会出现精确问题
// 方式二:DecimalFormat方式
//DecimalFormat默认采用了RoundingMode.HALF_EVEN这种类型,而且format之后的结果是一个字符串类型String
DecimalFormat df = new DecimalFormat(“#.000”);
System.out.println(df.format(new BigDecimal(1.0145)));//1.014
System.out.println(df.format(new BigDecimal(1.1315)));//1.132
// 方式三:
double d = 3.1415926;
String result = String.format(“%.2f”, d);
// %.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型。
java中小数怎么四舍五入?
按照你的要求为不确定保留几位小数的字符串做四舍五入的Java程序如下
import java.math.BigDecimal;
public class A {
public static void main(String[] args) {
String s=”0.00000999999997″;
//四舍五入,length是小数位数
int length=s.substring(s.indexOf(“.”)+1).length();
String s1=String.format(“%.”+(length-1)+”f”,new BigDecimal(s));
//去尾部0
BigDecimal bd=new BigDecimal(s1).stripTrailingZeros();
System.out.println(bd.toPlainString());
}
}
java代码实现四舍五入的方式
如果你是用来交差的,可以再声明让我们贴代码,如果你是学习的,那么就探讨一下1.四舍五入时可以用到int类型,它的得到的是整数,舍弃小数部分。2.动脑筋想一些小办法,四舍五入可以自己写方法,不必用到API。
能进一,必然大于等于该数。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表优客号立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://www.youkehao.org.cn/article/118686.html
如若内容造成侵权/违法违规/事实不符,请联系优客号进行投诉反馈,一经查实,立即删除!