double进行四舍五入
一、故障现象
排行榜中出现同一物品的评分不同
物品A原为8.5 排行榜中8分
二、导致原因
在查询数据库时,使用mysql 函数对rate 字段进行了处理 round(rate,1) 小数点后 保留一位,
在mysql中,round函数用于数据的四舍五入,它有两种形式:
1、round(x,d) ,x指要处理的数,d是指保留几位小数
这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0;
而在查询排行榜是没有做如上处理
三、解决方案
在查询排行榜时对物品的评分使用 java 进行四舍五入
四 、优化建议
方法一:使用字符串格式化实现四舍五入(支持float和double类型)double data = 3.02;//利用字符串格式化的方式实现四舍五入,保留1位小数String result = String.format("%.1f",data);//1代表小数点后面的位数, 不足补0。f代表数据是浮点类型。保留2位小数就是“%.2f”,依此累推。System.out.println(result);//输出3.0方法二:使用BigDecimal实现四舍五入(支持float和double类型)double data = 3.02;//利用BigDecimal来实现四舍五入.保留一位小数double result = new BigDecimal(data).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();//1代表保留1位小数,保留两位小数就是2,依此累推//BigDecimal.ROUND_HALF_UP 代表使用四舍五入的方式System.out.println(result);//输出3.0
1
2
3
4
5
6
方法三:使用DecimalFormat实现四舍五入(仅支持float类型)DecimalFormat decimalFormat=new DecimalFormat("#.##");//保留2位小数,.后面的#代表小数点后面的位数,保留3位小数就是#.###System.out.println(decimalFormat.format(3.065f));//输出3.07System.out.println(decimalFormat.format(3.065));//double类型,输出3.06
————————————————
版权声明:本文为CSDN博主「devnn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/devnn/article/details/83104228方法 四: 使用 BigDecimal的round 方法 实现四舍五入long start4 = System.nanoTime();
BigDecimal bigDecimal = new BigDecimal("7.08");
MathContext mathContext = new MathContext(2, RoundingMode.HALF_UP);
// 保留小数点后一位小数
double v1 = bigDecimal.round(mathContext).doubleValue();
long end4 = System.nanoTime();
System.out.println(v1+"============"+(end4-start4));
第四种的速度最快
round()在四舍五入时可能会引发异常。
源自
https://blog.csdn.net/cumtb2009/article/details/107795748package com.test;import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.LocalDateTime;/*** @Author yanming* @Description* @Date 2021/9/22 17:32*/
public class NumberFormat {public static void main(String[] args) {long start = System.nanoTime();double number = 7.08;String format = String.format("%.1f", number);long end = System.nanoTime();System.out.println(format+"============"+(end-start));long start1 = System.nanoTime();double number2 = 7.08;double v = new BigDecimal(number2).setScale(1, BigDecimal.ROUND_HALF_DOWN).doubleValue();long end1 = System.nanoTime();System.out.println(v+"============"+(end1-start1));long start2 = System.nanoTime();double number3 = 7.08;DecimalFormat decimalFormat = new DecimalFormat("#.#");String format1 = decimalFormat.format(number3);long end2 = System.nanoTime();System.out.println(format1+"============"+(end2-start2));long start4 = System.nanoTime();BigDecimal bigDecimal = new BigDecimal("7.08");MathContext mathContext = new MathContext(2, RoundingMode.HALF_UP);double v1 = bigDecimal.round(mathContext).doubleValue();long end4 = System.nanoTime();System.out.println(v1+"============"+(end4-start4));
}//
// 7.1============17125900
// 7.1============1985900
// 7.1============1299700
// 7.1============68300}关于RoundingMode是一个数字精度的舍入枚举,通过不同的舍入模式,获得不同的舍入结果UP(BigDecimal.ROUND_UP),
//向上舍入 大于2 的为 3 2.01 3
// -1.6 -1
// -1.0 -1
DOWN(BigDecimal.ROUND_DOWN),
// 向下舍入 大于2 小于3.0 的为 2
// 2.99 2
// -1.6 -2
// -1.0 -1
CEILING(BigDecimal.ROUND_CEILING),
// 如果是正数 ,则向上舍入 如果是负数 ,则向下舍入
//2.1 3
//0.0 0
//-1.2 -2
FLOOR(BigDecimal.ROUND_FLOOR),
// 如果是正数,则向下舍入 ,如果是负数,则向上舍入
//5.5 5
// 5.9 6
//-1.1 -1`
//-1.6 -
HALF_UP(BigDecimal.ROUND_HALF_UP),
// 四舍五入
HALF_DOWN(BigDecimal.ROUND_HALF_DOWN),
// 如果要舍弃的部分 大于0.5 则向上取.负责向下取值
// 5.5 5
// 5.6 6
//-1.5 -1
//-1.6 -2
HALF_EVEN(BigDecimal.ROUND_HALF_EVEN),
// 向偶数部分取值
// 5.5 6
// 2.5 3
// -1.6 -2
// -2.5 -2
UNNECESSARY(BigDecimal.ROUND_UNNECESSARY);
// 舍入模式的断言操作,如果需要舍入则抛出异常 ArithmeticException
// -1.2 ArithmeticException
//2.2 ArithmeticException
//-1.0 -1
// 1.0 1
关于RoundingMode是一个数字精度的舍入枚举,通过不同的舍入模式,获得不同的舍入结果
UP(BigDecimal.ROUND_UP), //向上舍入 大于2 的为 3 2.01 3 // -1.6 -1 // -1.0 -1 DOWN(BigDecimal.ROUND_DOWN), // 向下舍入 大于2 小于3.0 的为 2 // 2.99 2 // -1.6 -2 // -1.0 -1 CEILING(BigDecimal.ROUND_CEILING), // 如果是正数 ,则向上舍入 如果是负数 ,则向下舍入 //2.1 3 //0.0 0 //-1.2 -2 FLOOR(BigDecimal.ROUND_FLOOR), // 如果是正数,则向下舍入 ,如果是负数,则向上舍入 //5.5 5 // 5.9 6 //-1.1 -1` //-1.6 - HALF_UP(BigDecimal.ROUND_HALF_UP), // 四舍五入 HALF_DOWN(BigDecimal.ROUND_HALF_DOWN), // 如果要舍弃的部分 大于0.5 则向上取.负责向下取值 // 5.5 5 // 5.6 6 //-1.5 -1 //-1.6 -2 HALF_EVEN(BigDecimal.ROUND_HALF_EVEN), // 向偶数部分取值 // 5.5 6 // 2.5 3 // -1.6 -2 // -2.5 -2 UNNECESSARY(BigDecimal.ROUND_UNNECESSARY); // 舍入模式的断言操作,如果需要舍入则抛出异常 ArithmeticException // -1.2 ArithmeticException //2.2 ArithmeticException //-1.0 -1 // 1.0 1
double进行四舍五入相关推荐
- Java中double类型四舍五入的方法总结
代码: double a = 13.245; //方法一: BigDecimal bd= new BigDecimal(a); Double b = bd.setScale(2, BigDecimal ...
- java(double/float)向上取整,向下取整,四舍五入
向上取整:Math.ceil(double a) 向下取整:Math.floor(double a) 四舍五入取整:Math.round(double a) 1.向输出上取整 public sta ...
- javadouble转int四舍五入_如何通过舍入将Java中的double转换为int?
要将double转换为int并将其四舍五入为最接近的整数(即与典型的(int)(1.8)and 不同(int)(1.2),它们都将"向下舍入"为0并返回1),只需在上加上0.5do ...
- java里面数字四舍五入,Java数字的四舍五入
关键技术剖析: java.math.BigDecimal和java.util.Math类可以实现数字的各种舍入.其中Math类仅提供四舍五入的功能,而BigDecimal类提供更加丰富的舍入功能. 舍 ...
- Java中的BigDecimal比较大于小于等于,四舍五入保留几位(setScale方法详解),加减乘除取余
本文主要讲解BigDecimal的比较运算,保留精度和取整和基础运算,BigDecimal与其他数据类型转换. 文章目录 比较运算 保留精度及取整 取整(保留0位小数) 保留精度 基础运算 BigDe ...
- 如何在Java中将double转换为int?
在本文中,我们将看到如何将double转换为int. 在Java编程中,您将有一个double原语值(例如82.14),但是要执行进一步的操作,您需要一个int值(例如82),所以让我们看看如何在Ja ...
- double类型保留小数点后两位的几种方法
double类型保留小数点后两位的几种方法 返回double类型 返回double类型需要注意的是:如果结果为2020.10时,输出的值为2020.1,只保留了一位小数. //四舍五入double o ...
- Hive四舍五入等用法
返回类型 函数名 说明 实例 double round(double a) 四舍五入 hive> select round(3.4); 3.0 hive> select round(3.6 ...
- Java小数向上取整、向下取整、四舍五入取整数
向上取整:Math.ceil(double a) 向下取整:Math.floor(double a) 四舍五入取整:Math.round(double a) 例: Math.ceil(24.1)–&g ...
最新文章
- python入门到精通需要学多久-python学习从入门到精通要多久
- 云计算的三种服务模式:IaaS,PaaS,SaaS
- python爬虫的应用-python网络爬虫应用实战
- 论文小综 | Using External Knowledge on VQA
- php删除尾部字符,php如何删除字符串末尾字符
- 音乐语音识别,one speech recognition,音标,读音,翻译,英文例句,英语词典
- .NET Remoting Basic(9)-上下文(CallContext)
- leetcode -- Construct Binary Tree from Preorder and Inorder Traversal
- RC电路 CR电路 理解
- cogs339 维修数列 ……
- C++中如何创建一个类?
- Spring Security系列教程03--创建SpringSecurity项目
- redis挂机问题搜查纪录
- Allegro如何改变线宽操作指导
- 计算机开机的四个画面,电脑系统开机时的欢迎使用四个漂亮字如何修改
- 修复液晶显示器屏幕上的划痕
- Allegro原理图反标教程
- style.left和offsetLeft 用法
- 华为儿童手表可以升级鸿蒙吗,华为儿童手表 4X功能更新,儿童版微信上线
- 基于SpringBoot搭建应用开发框架(一) —— 基础架构
热门文章
- IBM中高端阵列增加STEC MLC固态硬盘支持
- php手机号登陆,ecshop登录支持手机号码登录、邮箱登录
- 合并 Excel 的多张工作表Sheet报错:无法在此处粘贴此内容
- EST | 北大朱怀球组揭示大气微生物与人为活动的关联及对人体健康的影响
- (转载)类欧几里得(知识点整理+板子总结)
- 微信PC端打开网站页面空白
- DNF那个跨区服务器稳定,dnf2017年最新跨区表 dnf2017跨区大区汇总介绍
- Random类中的nextInt()函数
- Mybatis的一级缓存和二级缓存详解
- R语言用load(xxx.Rdata)报错 bad restore file magic number (file may be corrupted) -- no data loaded