java的四舍五入

JAVA DecimalFormat 保留小数位以及四舍五入的陷阱 需求 业务需要导出的Excel的数字内容保留两位小数,并且四舍五入 代码实现 百度一圈所抄袭的代码 DecimalFormat dfScale2 = new DecimalFormat("###.##"); dfScale2.format(1.125D); 发现问题 导出数据很诡异.不是所有数据都是如所想的四舍五入. 经过排查最终发现是RoundingMode的问题,应该使用HALF_UP, D...... 阅读详情

在项目中遇到四舍五入的一些问题,特地又深入了解了一下,找到这个,说的比较详细,记录一下方便之后查看原博客

 

四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了。在讲解之间我们先看如下一个经典的案例:

 public static void main(String[] args) {
        System.out.println("12.5的四舍五入值:" + Math.round(12.5));
        System.out.println("-12.5的四舍五入值:" + Math.round(-12.5));
    }
Output:
12.5的四舍五入值:13
-12.5的四舍五入值:-12

这是四舍五入的经典案例,也是我们参加校招时候经常会遇到的(貌似我参加笔试的时候遇到过好多次)。从这儿结果中我们发现这两个绝对值相同的数字,为何近似值会不同呢?其实这与Math.round采用的四舍五入规则来决定。

      四舍五入其实在金融方面运用的非常多,尤其是银行的利息。我们都知道银行的盈利渠道主要是利息差,它从储户手里收集资金,然后放贷出去,期间产生的利息差就是银行所获得的利润。如果我们采用平常四舍五入的规则话,这里采用每10笔存款利息计算作为模型,如下:

      四舍:0.000、0.001、0.002、0.003、0.004。这些舍的都是银行赚的钱。

      五入:0.005、0.006、0.007、0.008、0.009。这些入的都是银行亏的钱,分别为:0.005、0.004、.003、0.002、0.001。

      所以对于银行来说它的盈利应该是0.000 + 0.001 + 0.002 + 0.003 + 0.004 - 0.005 - 0.004 - 0.003 - 0.002 - 0.001 = -0.005。从结果中可以看出每10笔的利息银行可能就会损失0.005元,千万别小看这个数字,这对于银行来说就是一笔非常大的损失。面对这个问题就产生了如下的银行家涉入法了。该算法是由美国银行家提出了,主要用于修正采用上面四舍五入规则而产生的误差。如下:

      舍去位的数值小于5时,直接舍去。

      舍去位的数值大于5时,进位后舍去。

      当舍去位的数值等于5时,若5后面还有其他非0数值,则进位后舍去,若5后面是0时,则根据5前一位数的奇偶性来判断,奇数进位,偶数舍去。

      对于上面的规则我们举例说明

         11.556 = 11.56          ------六入

         11.554 = 11.55          -----四舍

         11.5551 = 11.56         -----五后有数进位

         11.545 = 11.54          -----五后无数,若前位为偶数应舍去

         11.555 = 11.56          -----五后无数,若前位为奇数应进位

      下面实例是使用银行家舍入法:

public static void main(String[] args) {
        BigDecimal d = new BigDecimal(100000);      //存款
        BigDecimal r = new BigDecimal(0.001875*3);   //利息
        BigDecimal i = d.multiply(r).setScale(2,RoundingMode.HALF_EVEN);     //使用银行家算法 
        
        System.out.println("季利息是:"+i);
        }
Output:
季利息是:562.50

在上面简单地介绍了银行家舍入法,目前java支持7中舍入法:

      1、 ROUND_UP:远离零方向舍入。向绝对值最大的方向舍入,只要舍弃位非0即进位。

      2、 ROUND_DOWN:趋向零方向舍入。向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。

     3、 ROUND_CEILING:向正无穷方向舍入。向正最大方向靠拢。若是正数,舍入行为类似于ROUND_UP,若为负数,舍入行为类似于ROUND_DOWN。Math.round()方法就是使用的此模式。

      4、 ROUND_FLOOR:向负无穷方向舍入。向负无穷方向靠拢。若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。

      5、 HALF_UP:最近数字舍入(5进)。这是我们最经典的四舍五入。

      6、 HALF_DOWN:最近数字舍入(5舍)。在这里5是要舍弃的。

      7、 HAIL_EVEN:银行家舍入法。

      提到四舍五入那么保留位就必不可少了,在java运算中我们可以使用多种方式来实现保留位。

保留位方法

方法一:四舍五入

double   f   =   111231.5585;
BigDecimal   b   =   new   BigDecimal(f);
double   f1   =   b.setScale(2,   RoundingMode.HALF_UP).doubleValue();

       在这里使用BigDecimal ,并且采用setScale方法来设置精确度,同时使用RoundingMode.HALF_UP表示使用最近数字舍入法则来近似计算。在这里我们可以看出BigDecimal和四舍五入是绝妙的搭配。

     方式二:

java.text.DecimalFormat   df   =new   java.text.DecimalFormat(”#.00″);
df.format(你要格式化的数字);

   例:new java.text.DecimalFormat(”#.00″).format(3.1415926)

      #.00 表示两位小数 #.0000四位小数 以此类推…

     方式三: 

 

double d = 3.1415926;

String result = String .format(”%.2f”);

%.2f %. 表示 小数点前任意位数   2 表示两位小数 格式后的结果为f 表示浮点型。

        方式四: 

      此外如果使用struts标签做输出的话,有个format属性,设置为format="0.00"就是保留两位小数

      例如:

<bean:write name="entity" property="dkhAFSumPl" format="0.00" />

或者

<fmt:formatNumber type="number" value="${10000.22/100}" maxFractionDigits="0"/>

maxFractionDigits表示保留的位数

 

详解BigDecimal及其加减乘除运算 目录 一、BigDecimal概述 二、构造函数详解 1、BigDecimal(int val) 2、BigDecimal(intval, MathContextmc) 3、BigDecimal(longval) 4、BigDecimal(longval, MathContextmc) 5、BigDecimal(BigIntegerval) 6、BigDecima... 阅读详情

相关推荐

Spark SQL functions

Functions

zhixingheyi_tian的博客 924

BigDecimal中使用ROUND_HALF_UP进行四舍五入

一般情况下,对于那些不需要准确计算精度的数字我们可以直接使用 Float 或 Double 处理,但是 Double.valueOf(String) 和Float.valueOf(String) 会丢失精度。如果我们需要精确计算的结果,则必须使用BigDecimal 类来操作。【注】使用 BigDecimal 进行计算时,我们不能再使用算术运算符(+、-、*、/)进行算数运算,而是使用 BigDecimal 类提供的 add、subtract、multiply、divide 等方法来进行算数运算。

JSUITDLWXL的博客 5700

JAVA中DecimalFormat如何进行四舍五入?

在JAVA中,有时候会对数值进行四舍五入处理,我们很快能想到DecimalFormat 类。 你有可能会用以下这种方式来处理: DecimalFormat df= new DecimalFormat("#.##"); df.setRoundingMode(RoundingMode.HALF_UP); 但是,这种方式存在一个问题,就是当小数位数第二数是奇数的时候,四舍五入就失效了。 RoundingMode.CEILING:取右边最近的整数 RoundingMode.DOWN:去掉小数部分取整.

猿小白的博客 4267

BigDecimal使用ROUND_HALF_UP进行四舍五入

BigDecimal bdTest = new BigDecimal(1.745); BigDecimal bdTest1 = new BigDecimal(0.745); bdTest = bdTest.setScale(2, BigDecimal.ROUND_HALF_UP); bdTest1 = bdTest1.setScale(2, BigDecimal.ROUND_HALF_UP); S...

黑土墨 13万+

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。

m0_70212665的博客 5713

大数据实时+离线项目架构----智慧物流大数据平台(超流行框架!)

智慧物流大数据平台 文章目录智慧物流大数据平台一、项目背景二、逻辑架构三、解决方案技术亮点:数据流转四、项目的技术选型4.1流式处理平台4.2 分布式计算平台4.3 海量数据存储框架软件版本总结 一、项目背景 本项目基于一家大型物流公司研发的智慧物流大数据平台。该物流公司是国内综合性快递、物流服务商,并在全国各地都有覆盖的网点。经过多年的积累、经营以及布局,拥有大规模的客户群,日订单达上千万。如此规模的业务数据量,传统的数据处理技术已经不能满足企业的经营分析需求。公司需要基于大数据技术构建数据中心,从而挖

weixin_48143996的博客 6430

java计算除法四舍五入_java四舍五入 java中两个整数相除怎么四舍五入

Java几种常见的四舍五入的方法题目要CSS布局HTML小编今天和大家分享编写一个四舍五入的函数,要CSS布局HTML小编今天和大家分享可以保留到小数点后面的任意一位。java四舍五入的函数:Math.round 语法: Math.round(x); 参数: x 为一数值。 解释: 方法。返回对参数x四舍五入后所得的整数近似值。 例子: public class MathTest { public...

weixin_33933221的博客 6552

Django 小实例S1 简易学生选课管理系统 —— 〇、初步介绍与演示

python Django实现的一个简易的教务选课系统。 介绍与演示的视频版本已发到我的b站: https://www.bilibili.com/video/BV1er4y1w7ty。 项目已上传到我的github: https://github.com/BigShuang/SimpleStudentCourseManagementSystem。 S1总目录: 〇、初步介绍与演示 一、项目流程梳理与数据库设计 ======================= 大爽歌作,made by big shuang.

大爽老师的博客 5944

java四舍五入BigDecimal

java四舍五入package Test;import java.math.BigDecimal; //引入这个包public class Test {  public static void main(String[] args) {   double i = 3.856;   // 舍掉小数取整   System.out.println("舍掉小数取整:

cuker919的专栏 3万+

戴尔PowerEdge服务器R450 RAID配置步骤

戴尔PowerEdge服务器R450 RAID配置步骤

且听风呤tmj的博客 6910

博途 V15.1安装步骤

温馨提醒:安装此软件电脑配置至少应满足以下要求 处理器 CoreTM i5-3320M 3.3 GHz 或相当 内存 至少8G 硬盘 300 GB SSD 显示器 15.6' 宽屏显示 (1920 x 1080) 1.双击打开【Siemens v15.1】文件夹。 2.鼠标右击【STEP 7 BasicProfess...

谢谢关注“小鱼教你模数电”,各平台同号 9万+

java四舍五入(java四舍五入的方法)

关于负数的四舍五入-1.84四舍五入为多少-1.86四舍五入为多 四舍五入是指绝对值的四舍五入 精确到0.1的是 1.84≈1.8 -.184≈-1.8 1.86≈1.9 -1.86≈-1.9 ....... Java的四舍五入函数是什么? public String format(int...

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 1332

相机Camera日志分析之二十六:高通相机Camx 基于预览1帧的process_capture_request重要完整日志【见注释】

文章摘要:该日志记录了一个相机预览请求的处理流程。系统从HAL层开始处理capture_request,填充预览/拍照的buffer数据,并激活相关pipeline。流程涉及多个模块(ChiNodeWrapper、IFE、IPE等)的协同工作,包括获取ImageBuffer、设置请求映射关系、处理特征美颜参数(开关状态0,级别1)等关键步骤。日志详细展示了从请求下发到各节点处理的完整链路,包含多次buffer获取、fence设置及数据传递过程,最终完成预览帧数据的处理和保存(第0帧和第1帧)。该流程体现了移

515

java中的四舍五入函数_Java中的四舍五入

Math类中有这样两个方法:1publicstaticlonground(doublea)2publicstaticintround(floata)方法1返回最接近参数的long,其结果相当于下面这个表达式的值:(long)Math.floor(a+0.5d)方法2返回最接近参数的int,其结果相当于下面这个表达式的值:(int)Math.floor(a+0.5f)这其实就是四舍五入了,只不...

weixin_35520863的博客 1987

【AI智能体】AI 编程 + 飞书CLI + Skills 重塑开发新范式实战操作详解

AI 编程 + 飞书CLI + Skills 重塑开发新范式实战操作详解

congge 3666

WS2812和homeassistant握手

本文学习了WS2812和homeassistant握手,后期会分享更多有趣物联网的操作从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。...

vor234的博客 811

java程序里的四舍五入,Java中的四舍五入

Math类中有这样两个方法:1publicstaticlonground(doublea)2publicstaticintround(floata)方法1返回最接近参数的long,其结果相当于下面这个表达式的值:(long)Math.floor(a+0.5d)方法2返回最接近参数的int,其结果相当于下面这个表达式的值:(int)Math.floor(a+0.5f)这其实就是四舍五入了,只不...

weixin_39955149的博客 557

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java四舍五入

定义一个int类型变量i,i为由浮点数变量d四舍五入后的整数类型,请将转换后的i进行输出用户随机输入的浮点数四舍五入之后的整数(小数点后一位>=5则进一,否则舍去) 练习地址:牛客题霸https://www.nowcoder.com/practice/cae89de6292b4084acb93659353260e0...

qq_62702877的博客 1449

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java实现四舍五入的操作

前言 由于刚接触到Java语言,对Java的理解不是太深刻,发布博客也是对自己所写的代码的回顾,题目不是太难,代码实现不一定完整,欢迎指出。一起加油。 题目需求 请定义一个方法, 对正数的小数进行四舍五入的操作(不考虑负数情况)。 四舍五入之后的结果是一个int整数类型并返回。最后对方法进行测试。 需求分析 由题可知,要定义方法来实现。要想我们的代码更加的灵活,可以设计从键盘录入一个数。四舍五入需要判断正数的小数部分是否大于5,要用到条件语句。这道题的难点部分就是怎么取到这个数的小数部分并做判断。不管这个数

你来跑我来追 3484

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

四舍五入 java_Java中四舍五入

Java有四舍五入函数--Math.round,通过一个例子看看他的用法:package math;public class MathRoundTest {/*** Math类中提供了三个与取整有关的方法:ceil,floor,round,* 这些方法的作用于它们的英文名称的含义相对应,例如:ceil的英文意义是天花板,该方法就表示向上取整,* Math.ceil(11.3)的结果为12,Math...

weixin_42525343的博客 863

在java里四舍五入怎么做_利用java怎么实现一个四舍五入功能

利用java怎么实现一个四舍五入功能发布时间:2020-12-02 16:46:08来源:亿速云阅读:68作者:Leah这期内容当中小编将会给大家带来有关利用java怎么实现一个四舍五入功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了。在讲解之间我们先看如下一个经典的案...

weixin_42498249的博客 9278

java 四舍五入运算_Java的四舍五入运算

背景最近接触银行项目,发现在做金额四舍五入的时候并没有传统意义上那么简单,银行为了尽量缩减在这方面的亏损,有一个单独的银行家舍入法。传统的四舍五入运算System.out.println("12.5的四舍五入值:" + Math.round(12.5));System.out.println("-12.5的四舍五入值:" + Math.round(-12.5));输出结果:12.5的四舍五入值:1...

weixin_39616287的博客 551

Java中的四舍五入

Math类中有这样两个方法: 1 public static long round(double a) 2 public static int round(float a)方法1返回最接近参数的long,其结果相当于下面这个表达式的值:

jiaziangbiancheng的专栏 818

java不四舍五入_JAVA-四舍五入之坑

四舍五入:四舍五入是一种精确度的计数保留法,与其他方法本质相同。但特殊之处在于,采用四舍五入,能使被保留部分的与实际值差值不超过最后一位数量级的二分之一:假如0~9等概率出现的话,对大量的被保留数据,这种保留法的误差总和是最小的。这也是我们使用这种方法为基本保留法的原因。一、数学上的四舍五入举几个例子:1.3 => 11.5 => 2-1.3 => -1-1.5 => -2...

weixin_39683021的博客 667

Java的四舍五入

学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:183993990 我们一起学Java! 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就...

chuifuhuo6864的博客 125
上一篇: eclipse 创建maven web项目
下一篇: js中Number()、parseInt()和parseFloat()的区别(字符串转数字、小数)
Hello_A_Z
博客等级 码龄10年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值