Java 浮点数精度控制
1、String.format(String format,Object… args)
Java中用String.format()来控制输出精度,
format参数用来设置精度格式,
args参数代表待格式化的数字。
返回值是格式化后的字符串。
Java API文档中的解释是这样的:
文档不好懂…
没关系
直接上代码!
1 2 3 4 5 6 7 8 9 10 11 | //精确到小数点后两位: public class test { public static void main(String args[]) { //格式控制与C语言类似 System. out .println(String.format( "%.2f" , Math.PI)); } } //结果 3.14 |
这种方法,在处理单个数据比较方便,如果要对大量数字进行格式化控制,这种方法就显得有些冗余。
下面这个方法比较适合批量处理数据,即:一次设定格式,一直使用该格式。
2、DecimalFormat类,用以定制小数格式
先上代码,如果不懂‘#’和‘0’代表什么意思,直接略过代码,去看后面的内容。了解之后再返回来看代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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的个数。
例如:
1 2 3 4 | pi = 3.142 System. out .println( new DecimalFormat( "0.00" ).format(pi)); //结果 3.14 |
小数点后两个0,代表精确到小数点后两位
例如:
1 2 3 4 | pi = 3.142 System. out .println( new DecimalFormat( "0.0000" ).format(pi)); //结果 3.1420 |
原本要精确到小数点后四位,但是小数点后不足四位,所以用0代替
一般情况下的精确度控制仅用0表示足够了。
那么“#”代表什么意思呢?
#:总是省略引导0
“#”和“0”都可以控制精度,但是当“#”所在的位置为0时,就会忽略掉这个0。忽略掉的这个0不影响结果的大小。
举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)