Bigdecimal类,使用DecimalFormat.format()后,损失精度的问题。

jiangkun1980 2007-09-18 11:15:21
现有16位整数,3位小数的一个Bigdecimal类型,用"###############0.000"格式后精度损失。程序如下:
Bigdecimal big1 = new Bigdecimal("7777777777777777.779");
DecimalFormat df = new DecimalFormat("###############0.000");

System.out.println(df.format(big1));

预想结果:7777777777777777.779
运行结果:7777777777777778.000

求将整数部和小数部分开求解以外的解决方案。谢谢赐教!
...全文
968 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
camelkiss 2011-01-11
  • 打赏
  • 举报
回复
使用com.ibm.math.BigDecimal结果是7777777777777778.000
使用java.math.BigDecimal结果是7777777777777777.779
zxf小小程序员 2008-05-22
  • 打赏
  • 举报
回复
我是使用的jdk1.5运行的。没有损失精度.
yingchuang 2008-02-15
  • 打赏
  • 举报
回复
运行结果同楼主,楼上的怎么会得到正确结果?
zephyr_cc 2007-09-19
  • 打赏
  • 举报
回复
我运行没问题,没损失精度
唔,其实里面就是一个工具,加减乘除、保留两位小数。一共5个方法。。。emmmm.....为啥分这么高呢。因为宝宝想分想疯了。 附代码,有土豪就打赏打赏,没土豪的直接拿去使吧。 package cn.cisdom.base.utils; import java.math.BigDecimal; import java.text.DecimalFormat; public class Calculation { public static final DecimalFormat df = new DecimalFormat("######0.00"); /** * @methodName format2point * @desc 保留两位小数点 * @param value * @return java.lang.String * @author xm * @create 2018/6/7 12:03 **/ public static String format2point(Number value) { return df.format(value); } public static Double add(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * * @param value1 * 减数 * @param value2 * 被减数 * @return 两个参数的差 */ public static Double sub(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * * @param value1 * 被乘数 * @param value2 * 乘数 * @return 两个参数的积 */ public static Double mul(Number value1, Number value2) { BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.multiply(b2).doubleValue(); } /** * 提供精确的除法运算。 * * @param value1 * 除数 * @param value2 * 被除数 * @return 除数/被除数 */ public static Double div(Number value1, Number value2) { //MathContext mc = new MathContext(2, RoundingMode.HALF_DOWN);//精度为2,舍入模式为大于0.5进1,否则舍弃 BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1.divide(b2).doubleValue(); } public static void main(String[] args) { Double aDouble=Calculation.add(56.9, 1.67); System.out.println(aDouble); Double bDouble=Calculation.sub(99.2,aDouble); System.out.println(bDouble); } }

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧