解决double转 BigDecimal 时出现的精度失真问题

解决double转 BigDecimal 时出现的精度失真问题解决double转BigDecimal时出现的精度问题比如,doubledd=344999.03d;转成BigDecimal类型,BigDecimalss=newBigDecimal(dd);最后,ss的值是344999.03000000002793967723846435546875失真了。解决方法是先将dd转换字符串,然后转换成BigDecimal。/…

大家好,又见面了,我是你们的朋友全栈君。

比如,double dd=344999.03d;
转成 BigDecimal 类型,BigDecimal ss=new BigDecimal(dd);
打印 ss 的值是344999.03000000002793967723846435546875
精度失真啦!

解决方法是
先将 double 转换 字符串,
然后转换成 BigDecimal 。

代码:

/** * 解决double转bigdecimal时出现的精度问题 * @param v1 * @return */
public static BigDecimal doubleToBig(double v1) { 
   
	return new BigDecimal(String.valueOf(v1));
}

查询BigDecimal 源码,得出结论:
所有的 基本数字类型(float、double)转换 BigDecimal 或 BigInteger时,

先将 数字类型 先转成字符串,然后再转换BigDecimal 或 BigInteger。

最后,附上 double转 BigDecimal 的工具类

package com.delongra.nback.system.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;


/** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。 */
public class DoubleUtil { 
   

	// 默认除法运算精度
	private static final int DEF_DIV_SCALE = 10;
	/**#.## */
	public static final String REG_1 = "#.##";
	/** #,###.## */
	public static final String REG_2 = "#,###.##";

	// 这个类不能实例化
	private DoubleUtil() { 
   
	}

	/** * 解决double转bigdecimal时出现的精度问题 * @param v1 * @return */
	public static BigDecimal doubleToBig(double v1) { 
   
		return new BigDecimal(String.valueOf(v1));
	}
	
	
	/** * 科学记数法转换成字符串 */
	public static String doubleToStr(double v1) { 
   
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		return b1.toPlainString();
	}
	/** * 科学记数法转换成字符串 */
	public static String stringToStr(String v1) { 
   
		BigDecimal b1 = new BigDecimal(v1);
		return b1.toPlainString();
	}
	
	/** * 主要用于格式化金额 * @param v1 * @return */
	public static String format(double v1) { 
   
		NumberFormat numberFormat = new DecimalFormat(REG_2);
		String str = numberFormat.format(v1);
		return str;
	}
	
	/** * 主要用于格式化小数点 * @param v1 * @param reg * @return */
	public static String format(double v1,String reg) { 
   
		NumberFormat numberFormat = new DecimalFormat(reg);
		String str = numberFormat.format(v1);
		return str;
	}
	
	
	/** * 加法 */
	public static double add(double v1, double ...v2) { 
   
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		for (double vv : v2){ 
   
			BigDecimal b2 = new BigDecimal(Double.toString(vv));
			b1=b1.add(b2);
		}
		return b1.doubleValue();
	}

	/** * 减法 */
	public static double sub(double v1, double ...v2) { 
   
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		for (double vv : v2){ 
   
			BigDecimal b2 = new BigDecimal(Double.toString(vv));
			b1=b1.subtract(b2);
        }
		
		return b1.doubleValue();
	}

	
	/** * 乘法 */
	public static double mul(double v1,double ...v2) { 
   
		BigDecimal b1=new BigDecimal(Double.toString(v1));
		for (double vv : v2){ 
   
			BigDecimal b2 = new BigDecimal(Double.toString(vv));
			b1=b1.multiply(b2);
        }
		return b1.doubleValue();
	}

	/** * 除法 */

	public static double div(double v1, double ...v2) { 
   
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		for (double vv : v2){ 
   
			BigDecimal b2 = new BigDecimal(Double.toString(vv));
			b1=b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP);
        }
		return b1.doubleValue();
	}

	/** * 小数的四舍五入 */

	public static double round(double v, int scale) { 
   
		if (scale < 0) { 
   
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b = new BigDecimal(Double.toString(v));
		BigDecimal one = new BigDecimal("1");
		return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	
	/** * 两个数比较,获取比较值相对于基准值的大小百分比 * @param base 基准值 * @param compare 比较值 * @return */
	public static String getComparePercent(int base,int compare){ 
   
		if (base==compare) { 
   
			return "0%";
		}
		if (compare==0) { 
   
			return "0%";
		}
		if (base==0) { 
   
			return compare*100+"%";
		}
        NumberFormat numberFormat = NumberFormat.getInstance();  
        numberFormat.setMaximumFractionDigits(2); // 设置精确到小数点后2位 
        int margin = compare-base;
        String result = numberFormat.format((float) margin / (float) base * 100);  
		return result + "%";
	}	
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137391.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 单片机 串口编程之串口通信仿真实验

    单片机 串口编程之串口通信仿真实验单片机串口编程之串口通信仿真实验一、简述记–简单的使能串口,串口收发数据的例子。(使用Proteus仿真+虚拟串口调试)代码,仿真文件打包:链接:https://pan.baidu.com/s/1nyb46fTJrYcAy_VarFdO3A提取码:j44s蓝奏:https://www.lanzous.com/i2fx3oh……

    2025年8月20日
    42
  • 圆柱体积怎么算立方公式_圆柱体积计算公式 计算方法有哪些[通俗易懂]

    圆柱体积怎么算立方公式_圆柱体积计算公式 计算方法有哪些[通俗易懂]体积公式是用于计算各种几何体体积的数学算式,那么,圆柱体积计算公式是什么呢?下面小编整理了圆柱体积计算公式,供大家参考!圆柱体积计算公式有哪些π是圆周率,一般取3.14r是圆柱底面半径h为圆柱的高圆柱体体积=底面积×高V=πr2h=V=sh还可以是v=1/2ch×r侧面积的一半×半径圆柱体积相关公式圆柱的侧面积=底面圆的周长×高圆柱的表面积=上下底面面积+侧面积圆柱的体积=底面积×高圆柱的体积怎么…

    2026年2月4日
    4
  • 软件安装管家【软件目录】[通俗易懂]

    https://blog.csdn.net/luai_l/article/details/106318576

    2022年4月18日
    76
  • Linux安装rinetd

    为什么80%的码农都做不了架构师?>>>…

    2022年4月7日
    124
  • 龙族h路明非和诺诺_龙族六

    龙族h路明非和诺诺_龙族六清晨,路明非正在熟睡,‘起床了路明非,太阳照屁股了!’芬格尔大喊,路明非终于被惊醒,揉了揉眼睛不满道:‘芬格尔你搞毛线啊!今天可是星期天!’‘星期你妹啊!今天要出任务了你TM还睡!’路明非一听有任务脑子瞬间清醒拿起手机一看“卧槽(#゚Д゚)!都八点了,要迟到了,再晚就要挨骂了。”芬格尔忙说“那你赶紧穿上衣服走了”。“哦,好好,那咱们走吧”。两人穿好衣服急急忙忙的向机场过去。等两人终于到…

    2022年10月8日
    5
  • 五、eclipse如何创建一个ftl(FreeMarker)的文件和设置ftl文件的显示风格(ftl文件高亮显示)

    五、eclipse如何创建一个ftl(FreeMarker)的文件和设置ftl文件的显示风格(ftl文件高亮显示)1、首先需要在eclipse中去下载一个FreeMarker插件https://blog.csdn.net/IT_CREATE/article/details/86682538 2、创建ftl的文件(有多种方式,我会分别介绍)2.1利用file来创建,我们new个file文件写上页面的名字,后缀名改为ftl这样就创建好了,不过里面没有任何内容,我们需要自己添加一些基…

    2022年6月17日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号