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
Java 浮点数精度控制的更多相关文章
- Java 浮点数精度丢失
Java 浮点数精度丢失 问题引入 昨天帮室友写一个模拟发红包抢红包的程序时,对金额统一使用的 double 来建模,结果发现在实际运行时程序的结果在数值上总是有细微的误差,程序运行的截图: 输入依次 ...
- java浮点数精度问题解决方法
基础知识回顾: BigDecimal.setScale()方法用于格式化小数点setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOW ...
- HDU 1007 Quoit Design(二分+浮点数精度控制)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- C++: sprintf浮点数精度控制;
错误的写法: char buf[100]; int num = 10; sprintf(buf, "%.2f", num); ///这种做法是不对的, 按照压栈顺序, 在压入num ...
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
(转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...
- 计算价格, java中浮点数精度丢失的解决方案
计算价格, java中浮点数精度丢失的解决方案
- js,java,浮点数运算错误及应对方法
js,java浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2 ...
- POI使用:用poi接口不区分xls/xlsx格式解析Excel文档(41种日期格式解析方法,5种公式结果类型解析方法,3种常用数值类型精度控制办法)
一.使用poi解析excel文档 注:全部采用poi接口进行解析,不需要区分xls.xlsx格式,不需要判断文档类型. poi中的日期格式判断仅支持欧美日期习惯,对国内的日期格式并不支持判断,怎么办? ...
- Poj 2350 Above Average(精度控制)
一.Description It is said that 90% of frosh expect to be above average in their class. You are to pro ...
随机推荐
- AI 所需的数学基础
一.[微积分] 基础概念(极限.可微与可导.全导数与偏导数):只要学微积分,就必须要明白的概念,否则后面什么都无法继续学习. 函数求导:求导是梯度的基础,而梯度是 AI 算法的基础,因此求导非常重要! ...
- 深入浅出Mybatis系列三-配置详解之properties与environments(mybatis源码篇)
注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇 ...
- C# LINQ学习笔记四:LINQ to OBJECT之操作文件目录
本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5816051.html,记录一下学习过程以备后续查用. 许多文件系统操作实质上是查询,因此非常适合使用LINQ方 ...
- Java连载85-集合的Contains和Remove方法
一.包含与删除两种方法解析 1.boolean contains(Object o);判断集合中是否包含某个元素. package com.bjpowernode.java_learning; imp ...
- 事件分析法学习笔记(ESM)
事件分析法基础学习笔记 1.定义 事件分析法是研究某事件的发生对组织价值的影响以及影响程度. 或者说研究特定事件对组织行为的影响. notes:事件分析法的关键点在于探讨所关注事件在某个时段产生的 ...
- 假期学习【五】RDD编程实验四
今天完成了实验四的第二问和第三问 第二题 对于两个输入文件 A 和 B,编写 Spark 独立应用程序,对两个文件进行合并,并剔除其 中重复的内容,得到一个新文件 C.下面是输入文件和输出文件的一个样 ...
- Django 初试水(三)
在前面的一和二中,分别实现了一些基础的操作,数据库和 Django 自带的管理界面,接下来,主要是创建我们自己的界面(视图). 访问一个地址,对应的服务器直接返回一个视图.这是最常见的交互. 就好比访 ...
- Ubuntu18.04安装phpMyAdmin
1.使用apt自动安装 sudo apt install phpmyadmin 2.安装完成后,创建软链接到web根目录下(我的是/var/www/html/) sudo ln -s /usr/sha ...
- Linux - mysql 异常: ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists
问题描述 ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists 解决方案 删除:/var/lock/su ...
- Vue之生命周期activated与created使用
created activated 触发顺序 组件创建最初始 created => mounted =>activated 触发次数 只在组件刚创建时创建 在使用keep-alive标 ...