Java 浮点数精度控制

1、String.format?(String format,Object… args)
Java中用String.format()来控制输出精度,
format参数用来设置精度格式,
args参数代表待格式化的数字。
返回值是格式化后的字符串。
Java API文档中的解释是这样的:

文档不好懂… 
没关系 
直接上代码!

//精确到小数点后两位:
public class test {
    public static void main(String args[])
    {
        //格式控制与C语言类似
        System.out.println(String.format("%.2f", Math.PI));
    }

}
//结果
3.14

这种方法,在处理单个数据比较方便,如果要对大量数字进行格式化控制,这种方法就显得有些冗余。 
下面这个方法比较适合批量处理数据,即:一次设定格式,一直使用该格式。

2、DecimalFormat类,用以定制小数格式

先上代码,如果不懂‘#’和‘0’代表什么意思,直接略过代码,去看后面的内容。了解之后再返回来看代码。

public class test {
    public static void main(String args[])
    {
//      System.out.println(String.format("%.2f", Math.PI));
        double pi = 3.142;
        //仅取整数部分
        System.out.println(new DecimalFormat("0").format(pi));//3
        System.out.println(new DecimalFormat("#").format(pi));//3
        //取小数点后两位
        System.out.println(new DecimalFormat("0.00").format(pi));//3.14
        //取小数点后两位,整数部分取两位,不足前面补零
        System.out.println(new DecimalFormat("00.00").format(pi));//03.14
        //取小数点后4位,不足补零
        System.out.println(new DecimalFormat("0.0000").format(pi));//3.1420
        //以百分比方式计数并小数点后2位
        System.out.println(new DecimalFormat("0.00%").format(pi));//314.20%

        long l = 123456789;
        //科学计数法,取5位小数
        System.out.println(new DecimalFormat("0.00000E0").format(l));//1.23457E8
        //显示为两位整数,并保留小数点后四位的科学计数法
        System.out.println(new DecimalFormat("00.0000E0").format(l));//12.3457E7
        //每三位以逗号分隔
        System.out.println(new DecimalFormat(",000").format(l));//123,456,789
        //嵌入格式文本
        System.out.println(new DecimalFormat("这个长整数为:0").format(l));//这个长整数为:123456789
    }

}

看了这么半天“#”和“0”,那么这两个有什么区别呢?先别急,等我慢慢解释。 
先放两张截图自己揣摩一下(看不懂继续往后翻):

这两张图片内容类似,但互为补充。

接下来着重解释一下“0”和“#”。这是精度控制的核心所在。

0:0总是显示出来,如果不足以0补足,如果多余则精确度为0的个数。

例如:

pi = 3.142
System.out.println(new DecimalFormat("0.00").format(pi));
//结果
3.14

小数点后两个0,代表精确到小数点后两位 
例如:

pi = 3.142
System.out.println(new DecimalFormat("0.0000").format(pi));
//结果
3.1420

  

原本要精确到小数点后四位,但是小数点后不足四位,所以用0代替
一般情况下的精确度控制仅用0表示足够了。
那么“#”代表什么意思呢?

#:总是省略引导0
“#”和“0”都可以控制精度,但是当“#”所在的位置为0时,就会忽略掉这个0。忽略掉的这个0不影响结果的大小。
举个例子

public static final DecimalFormat df1 = new DecimalFormat( "#.##" );
public static final DecimalFormat df2 = new DecimalFormat( "#.00" );

System.out.println(df1.format(7.80));//8后面的0被忽略
System.out.println(df1.format(85));//不会在后面补0
System.out.println(df1.format(85.786));//正常显示精度,因为后面没有出现0
System.out.println(df1.format(85.796));//根据四舍五入,后面的0被忽略

System.out.println(df2.format(7.80));
System.out.println(df2.format(85));
System.out.println(df2.format(85.786));
//结果
7.8
85
85.79
85.8

7.80
85.00
85.79 

也就是说,使用#号来控制精度,可能起不到控制精度的效果。

因此建议,始终用0来控制精度。

参考:
http://tutorials.jenkov.com/java-internationalization/decimalformat.html
https://blog.csdn.net/thunder4393/article/details/1739911
https://www.cnblogs.com/hq233/p/6539107.html
https://stackoverflow.com/questions/16583604/formatting-numbers-using-decimalformat

————————————————
版权声明:本文为CSDN博主「Medlen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38481963/article/details/82120870

原文地址:https://www.cnblogs.com/longlyseul/p/11577831.html

时间: 2024-10-15 18:17:52

Java 浮点数精度控制的相关文章

Java 浮点数精度丢失

Java 浮点数精度丢失 问题引入 昨天帮室友写一个模拟发红包抢红包的程序时,对金额统一使用的 double 来建模,结果发现在实际运行时程序的结果在数值上总是有细微的误差,程序运行的截图: 输入依次为:红包个数,抢红包的人数,选择固定金额红包还是随机金额红包,每个红包的金额(此例只有一个红包). 注意到程序最后的结果是有问题的,我们只有一个金额为 10 的红包,一个人去抢,所以正确结果应该为这个人抢到了 10 RMB. 为了使问题更加明显,我们测试一个更加简单的例子: public class

HDU 1007 Quoit Design(二分+浮点数精度控制)

Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 47104    Accepted Submission(s): 12318 Problem Description Have you ever played quoit in a playground? Quoit is a game in which fla

又见浮点数精度问题

今天看到一篇文章:http://younglab.blog.51cto.com/416652/241886,大概是说在使用Javascript进行下面的浮点数计算时出现了问题: obj.style.opacity =  (parseInt(obj.style.opacity *100) + 1)/100; obj.style.opacity是一个浮点数,范围从0~1,初始值为0.这句代码每隔一小段时间执行一次,从而让目标由透明慢慢变为不透明(淡入效果). 问题是,起初obj.style.opac

一个由于浮点数精度导致的错误

今天看到一篇文章:http://younglab.blog.51cto.com/416652/241886,大概是说在使用Javascript进行下面的浮点数计算时出现了问题: obj.style.opacity = (parseInt(obj.style.opacity *100) + 1)/100; obj.style.opacity是一个浮点数,范围从0~1,初始值为0.这句代码每隔一小段时间执行一次,从而让目标由透明慢慢变为不透明(淡入效果).起初,obj.style.opacity能够

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库 一.控制显示多少位小数位 有些时候小数位数太多了,想保留多少位小数,这里介绍一种利用四舍五入保留想要的小数位数Math.round四舍五入到整数位,所以把小数乘以整10或整百,在除以整10或整百,就得到想要的位数了 double a = 3.14159265359;double weishu = 5;double b = Math.pow(10,weishu);a = Math.round(a*b)/b; 二.

文件重定向,getline()获取一样,屏幕输出流,格式控制符dec,oct,hex,精度控制setprecision(int num),设置填充,cout.width和file(字符),进制输入

 1.在window下的命令重定向输出到文件中 2.将内容输入到某个文件中的方式:命令<1.txt (使用1.txt中的命令) 3.读取文件中的名,然后将命令读取最后输出到文件中.命令<1.txt>2.txt   这一句的作用就是将执行的命令输入到2.txt中. 4.文件重定向案例1 #include <iostream> using namespace std; void main() { char str[30] = { 0 }; cin >> str;

Java 访问权限控制:你真的了解 protected 关键字吗?

摘要: 在一个类的内部,其成员(包括成员变量和成员方法)能否被其他类所访问,取决于该成员的修饰词:而一个类能否被其他类所访问,取决于该类的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下,包访问权限),protected 和 public,而其中只有包访问权限和public才能修饰一个类(内部类除外).特别地,很多的介绍Java的书籍对protected介绍的比较笼统,常常会对大家造成误解.因此,本文重点揭示了 protected 关键字的内涵和用法,并介绍了一些其他

js,java,浮点数运算错误及应对方法

js,java,浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2进制的进制基数是2,那么一个数字只要被因素包含大于2的质数的数除,都会产生无限循环小数.无限循环小数和无理数都无法,和非无限循环的有理数一起用同一种方式存储到存储介质上的同时还保持计算的兼容性. 对于无限循环小数,可以设计一种格式存储到介质上,但是同时又要和非无限循环的有理数能够计算,效率应该会变

采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址

采用truelicense进行Java规划license控制 扩展可以验证后,license 开始结束日期,验证绑定一个给定的mac住址. Truelicense 它是一个开源java license 检验项目. 使用truelicense实现用于JAVAprojectlicense机制(包含license生成和验证)请參考http://www.it165.net/pro/html/201404/11540.html 当中包含license授权机制的原理和制作license的详细步骤 本文主要是