BigDecimal四舍五入的问题?

问题描述

1 . System.out.println(new BigDecimal(1.555).setScale(2, BigDecimal.ROUND_HALF_UP));输出:1.552 . System.out.println(new BigDecimal(0.555).setScale(2, BigDecimal.ROUND_HALF_UP));输出:0.563 . System.out.println(new BigDecimal(1.556).setScale(2, BigDecimal.ROUND_HALF_UP));输出:1.56为什么第一个输出为1.55 我预期输出的结果是1.56? 问题补充:enet_java 写道

解决方案

仔细看看API应该就可以明白了。 引用public BigDecimal(double val)将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。返回的 BigDecimal 的标度是使 (10scale × val) 为整数的最小值。 注: 此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。 另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。 当 double 必须用作 BigDecimal 的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用 Double.toString(double) 方法,然后使用 BigDecimal(String) 构造方法,将 double 转换为 String。要获取该结果,请使用 static valueOf(double) 方法。
解决方案二:
定义为字符串就可以了,new BigDecimal("1.555").setScale(2, BigDecimal.ROUND_HALF_UP)。以前有人问过这个问题

时间: 2024-08-24 19:29:18

BigDecimal四舍五入的问题?的相关文章

java BigDecimal四舍五入结果错误的bug

问题描述 java BigDecimal四舍五入结果错误的bug for (double i = 511.55; i < 2050.55; i++) { BigDecimal bd = new BigDecimal(i); bd =bd.setScale(1, BigDecimal.ROUND_HALF_UP); System.out.println(bd.doubleValue()); } 512-2048 之内的值 四舍五入不对 全部舍位了.没有进位 是不是电脑的问题? ROUND_HALF

java-BigDecimal 四舍五入结果不一致

问题描述 BigDecimal 四舍五入结果不一致 BigDecimal number=new BigDecimal(18.9045613);System.out.print(""RoundingMode四舍五入: "" + number.setScale(2RoundingMode.UP) ); //18.91System.out.print(""BigDecimal四舍五入: "" + number.setScale(2B

介绍Java的大数类(BigDecimal)和八种舍入模式_java

1.BigDecimal简介 BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后的位数.如果为负数,则将该数的非标度值乘以 10 的负scale 次幂.因此,BigDecimal表示的数值是(unscaledValue × 10-scale). 2.BigDecimal的引入 在利用Java编程语言开发银行.金融类等需要对数值进行高精度计算的软件时,我们经常使用BigDecimal和BigInteger这两个大数类,而不是

.net decimal保留指定的小数位数(不四舍五入)_实用技巧

前言 项目中遇到分摊金额的情况,最后一条的金额=总金额-已经分摊金额的和. 这样可能导致最后一条分摊的时候是负数,所以自己写了一个保留指定位数小数的方法. 扩展方法的使用,使得调用起来很优雅. 示例代码 public static class DecimalExtension { /// <summary> /// decimal保留指定位数小数 /// </summary> /// <param name="num">原始数量</param&

传统的四舍五入BigDecimal类,BUG?

问题描述 想要一个跟我们传统学的四舍五入的方法,网上多说下面的方法可以用,我测了下,发现有很多问题啊.当所要求的小数位小于等于1位时没错误,但当小数位2位以上就有问题了,下面是测试用例,及结果.测试发现当所要小数位为2位时,遇到偶数进1,奇数不进.十位数不位空时也是如此. 谁说下这个啥回事?顺便求其他传统格式化方法.DecimalFormat这个类也不行,奇数进1偶数不进的public class test { public static void main(String[] args) { d

Java中精确计算的一个类用BigDecimal

这个类确实好用.在网上找到大的,是一个女Java程序员写的.厉害~~~~~~哈哈/* * 创建日期 2004-10-14 * * 如果需要精确计算,非要用String来够造BigDecimal不可 */package com.lims.actions.testqc.comm; /** * @author Jstar * * * 窗口 > 首选项 > Java > 代码生成 > 代码和注释 */import java.math.BigDecimal; /*** 由于Java的简单类型

Java常用类库--Math、Random、NumberFormat、DecimalFormat、BigInteger、BigDecimal

1.Math类 表示数学操作,例如:平方根.四舍五入等等. public class MathDemo01{ public static void main(String args[]){ // Math类中的方法都是静态方法,直接使用"类.方法名称()"的形式调用即可 System.out.println("求平方根:" + Math.sqrt(9.0)) ; System.out.println("求两数的最大值:" + Math.max(1

BigDecimal 专题

import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; public class AddSubtractMultiplyDivide { public static void main(String[] args) { String q1 = "0.06 + 0.01 ="; String q2 = "1.0 - 0.42="; String

Java如何取double小数点后两位(四舍五入)

问题描述 如题,有方法的最好先测试一下.DecimalFormatdf=newDecimalFormat("#.00");用这个方法不行,有兴趣的可以测试一下这个数字:doublex=25470.085;用Math.round也不行,因为Math.round(-11.5)=-11而不是-12(当然此处可以自己封装一个方法,判断正负,但是希望能有更简单的方法) 解决方案 解决方案二:doublea=12.34564;doubleb=Math.round(a*100);System.out