精华内容
下载资源
问答
  • 2018-06-19 11:07:18
    有方法   java.math.BigDecimal.doubleValue()
    
    BigDecimal a = new BigDecimal(1000);
    return a.doubleValue();





    1.  public static void printDoubleToBigDecimal(double v1, double v2){  
    2.         BigDecimal d1TobigDe = new BigDecimal(v1);  
    3.         BigDecimal d2TobigDe = new BigDecimal(v2);  
    4.         System.out.println("d1TobigDe="+d1TobigDe);  
    5.         System.out.println("d2TobigDe="+d2TobigDe);  
    6.     } 

    更多相关内容
  • BigDecimalDouble转换

    2017-06-22 16:44:45
    BigDecimalDouble转换
  • BigDecimal类型和double类型的值相互转换 1.BigDecimaldouble,使用BigDecimal类里面doubleValue()方法: BigDecimal latitude = 39.97268600; double latitudeDou = latitude.doubleValue() 2.double转...

    BigDecimal类型和double类型的值相互转换

    1.BigDecimal转double,使用BigDecimal类里面doubleValue()方法:

    BigDecimal latitude = 39.97268600;
    double latitudeDou = latitude.doubleValue()
    

    2.double转BigDecimal,使用BigDecimal类里面valueOf()方法:

    double latitudeDou = 39.97268600;
    BigDecimal latitude = BigDecimal.valueOf(latitudeDou);
    
    展开全文
  • I am working with an application that is based entirely on doubles, and am having trouble in one utility method that parses a string into a double. I've found a fix where using BigDecimal for the con....

    I am working with an application that is based entirely on doubles, and am having trouble in one utility method that parses a string into a double. I've found a fix where using BigDecimal for the conversion solves the issue, but raises another problem when I go to convert the BigDecimal back to a double: I'm losing several places of precision. For example:

    import java.math.BigDecimal;

    import java.text.DecimalFormat;

    public class test {

    public static void main(String [] args){

    String num = "299792.457999999984";

    BigDecimal val = new BigDecimal(num);

    System.out.println("big decimal: " + val.toString());

    DecimalFormat nf = new DecimalFormat("#.0000000000");

    System.out.println("double: "+val.doubleValue());

    System.out.println("double formatted: "+nf.format(val.doubleValue()));

    }

    }

    This produces the following output:

    $ java test

    big decimal: 299792.457999999984

    double: 299792.458

    double formatted: 299792.4580000000

    The formatted double demonstrates that it's lost the precision after the third place (the application requires those lower places of precision).

    How can I get BigDecimal to preserve those additional places of precision?

    Thanks!

    Update after catching up on this post. Several people mention this is exceeding the precision of the double data type. Unless I'm reading this reference incorrectly:

    http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3

    then the double primitive has a maximum exponential value of Emax = 2K-1-1, and the standard implementation has K=11. So, the max exponent should be 511, no?

    解决方案

    You've reached the maximum precision for a double with that number. It can't be done. The value gets rounded up in this case. The conversion from BigDecimal is unrelated and the precision problem is the same either way. See this for example:

    System.out.println(Double.parseDouble("299792.4579999984"));

    System.out.println(Double.parseDouble("299792.45799999984"));

    System.out.println(Double.parseDouble("299792.457999999984"));

    Output is:

    299792.4579999984

    299792.45799999987

    299792.458

    For these cases double has more than 3 digits of precision after the decimal point. They just happen to be zeros for your number and that's the closest representation you can fit into a double. It's closer for it to round up in this case, so your 9's seem to disappear. If you try this:

    System.out.println(Double.parseDouble("299792.457999999924"));

    You'll notice that it keeps your 9's because it was closer to round down:

    299792.4579999999

    If you require that all of the digits in your number be preserved then you'll have to change your code that operates on double. You could use BigDecimal in place of them. If you need performance then you might want to explore BCD as an option, although I'm not aware of any libraries offhand.

    In response to your update: the maximum exponent for a double-precision floating-point number is actually 1023. That's not your limiting factor here though. Your number exceeds the precision of the 52 fractional bits that represent the significand, see IEEE 754-1985.

    Use this floating-point conversion to see your number in binary. The exponent is 18 since 262144 (2^18) is nearest. If you take the fractional bits and go up or down one in binary, you can see there's not enough precision to represent your number:

    299792.457999999900 // 0010010011000100000111010100111111011111001110110101

    299792.457999999984 // here's your number that doesn't fit into a double

    299792.458000000000 // 0010010011000100000111010100111111011111001110110110

    299792.458000000040 // 0010010011000100000111010100111111011111001110110111

    展开全文
  • 下面小编就大家带来一篇java中double转化为BigDecimal精度缺失的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 这些是网上抄袭行为不是原创留下自用的未经测试...在数据库中字段的类型decimal(数字,数字),在JSP程序中要把它转换double型的方法是: ((java.math.BigDecimal)row.get("数据库中字段")).doubleValue() 注:r

    这些是网上抄袭行为不是原创留下自用的未经测试不能尽信


    1、JSP中BigDecimal转换成double

    BigDecimal转换成double

    在数据库中字段的类型为decimal(数字,数字),在JSP程序中要把它转换成double型的方法是: ((java.math.BigDecimal)row.get("数据库中字段")).doubleValue()


    注:row是Map的对象。row.get("数据库中字段")得到的类型是Object,要先转换成与数据库类型相对应的decimal后,再转换成double.


    2、BigDecimal用法详解


    在我现在进行的项目中用到这种类型,用它来表示金额。可这种类型非常精确,当你在数据库里插入一条数据是6.00时,在显示时却是6.000000000000000000000。在页面显示非常不美观。在网上找了找,还真的找到了解决办法拿来和大家分享一下,在以后做系统时可以用到。它不仅可以做到double和float,而且在商业计算上也能显示它的作用。

    java.math.BigDecimal。BigDecimal一共有4个够造方法,让我先来看看其中的两种用法:

  • 第一种:BigDecimal(double val)
    Translates a double into a BigDecimal.

  • 第二种:BigDecimal(String val)
    Translates the String repre sentation of a BigDecimal into a BigDecimal.

  • 使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。

    public static double add(double v1,double v2)
    public static double sub(double v1,double v2)
    public static double mul(double v1,double v2)
    public static double div(double v1,double v2)
    public static double div(double v1,double v2,int scale)
    public static double round(double v,int scale)
    附录
    源文件Arith.java:
    import java.math.BigDecimal;
    /**
    * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
    * 确的浮点数运算,包括加减乘除和四舍五入。
    */
    public class Arith{ //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10; //这个类不能实例化
    private Arith(){
    }
    /**
    * 提供精确的加法运算。
    * @param v1 被加数
    * @param v2 加数
    * @return 两个参数的和
    */
    public static double add(double v1,double v2){
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.add(b2).doubleValue();
    }
    /**
    * 提供精确的减法运算。
    * @param v1 被减数
    * @param v2 减数
    * @return 两个参数的差
    */
    public static double sub(double v1,double v2){
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.subtract(b2).doubleValue();
    }
    /**
    * 提供精确的乘法运算。
    * @param v1 被乘数
    * @param v2 乘数
    * @return 两个参数的积
    */
    public static double mul(double v1,double v2){
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.multiply(b2).doubleValue();
    }
    /**
    * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
    * 小数点以后10位,以后的数字四舍五入。
    * @param v1 被除数
    * @param v2 除数
    * @return 两个参数的商
    */
    public static double div(double v1,double v2){
    return div(v1,v2,DEF_DIV_SCALE);
    }
    /**
    * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
    * 定精度,以后的数字四舍五入。
    * @param v1 被除数
    * @param v2 除数
    * @param scale 表示表示需要精确到小数点以后几位。
    * @return 两个参数的商
    */
    public static double div(double v1,double v2,int scale){
    if(scale<0){
    throw new IllegalArgumentException(
    "The scale must be a positive integer or zero");
    }
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
    * 提供精确的小数位四舍五入处理。
    * @param v 需要四舍五入的数字
    * @param scale 小数点后保留几位
    * @return 四舍五入后的结果
    */
    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();
    }
    };


    3、注意double不能强制转BigDecimal

    public class Test {
    	public static void main(String args[]) {
    		double b_OLD = 4.1625;
    		java.math.BigDecimal bd1 = new java.math.BigDecimal( b_OLD );
    		System.out.println("BEFORE ROUNDING: " + bd1);
    	}
    }
    
    可以用double类型初始化BigDecimal类。
    追问
    那为什么
            double  b = 4.44;
                  java.math.BigDecimal  big = (java.math.BigDecimal )b;
    这样不能转换呢? 有什么区别吗?
    回答
    因为double是基本数据类型,不可以强制类型转换的。强制类型转换是针对Object的。Double b = 4.44; 这样也是不行的,因为BigDecimal没有从Double继承,所以没有办法强制类型转换。

    展开全文
  • BigDecimal 转成 double

    2015-08-11 14:37:00
    NUMBER(20,2) 数据库里的字段number ,实体是BigDecimal ...将BigDecimal转成double public double getOrderamount() { if (orderamount != null) { BigDecimal b2 = new BigDecimal(100); re...
  • 对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。BigDecimal类的常用方法如表11-15所示。 表11-15 ...
  • BigDecimal大据类。 浮点型运算的时候直接 加减乘除时可能会出现数据失真(精度问题)。 BigDecimal可以解决浮点型运算数据失真的问题。 double a = 0.1; double b = 0.2; double c = a+b; System.out.println(c);...
  • 有方法 java.math.BigDecimal.doubleValue()BigDecimal a = new BigDecimal(1000); return a.doubleValue();
  • 解决Double类型在BigDecimal中精度丢失问题        最近在新公司遇到了一个bug,因为项目中涉及到了和金额相关的业务,所以就接触到了 BigDecimal 高精度类型,在处理BUG中遇到了...
  • 1.BigDecimal(double val): 失真, 不要使用 BigDecimal(0.1)的值是: 0.1000000000000000055511151231257827021181583404541015625  因为准确的来说0.1本身不能算是一个double(其实0.1不能代表任何一个定长二...
  • 会要求小数点后精确到几位数,例如涉及到费用的问题,通常会让我们精确到小数点后4位,就类似于“0.3333”的格式,当我们在想要进行精确到小数点后几位时,这时候就会想到BigDeimal对象来进行转化,不过在进行转化的...
  • BigDecimal b = new BigDecimal(webResponse.getGmv()); webResponse.setGmv(b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
  • 今天写代码过程中,发现一个Double的变量通过new BigDecimal(Double d)转换为BigDecimal时,有效数字改变了,如下: public class BigDecimalTest { public static void main(String[] arg) { String s1 = "123....
  • BigDecimaldouble转换遇到的问题

    千次阅读 2021-04-27 09:05:43
    Bigdecimal 类型值0.00006时转成Double会变成科学计数法 /** * 取消科学计数法 */ public String getPrincipal(Double principal){ NumberFormat nf = NumberFormat.getInstance(); //设置保留多少位小数 nf....
  • 介绍BigDecima什么可以解决计算的精度问题、基础使用和开发时应当注意的坑
  • 使用BigDecimal解决double类型数据运算的精度问题
  • **禁止使用构造方法 BigDecimal(double)的方式把 double转化为 BigDecimal 对象** **正例:**优先推荐入参 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了Double 的 toString,...
  • ​ 我最近在公司遇到了一个bug,因为项目中涉及到了...打断点后,可发现double类型数据转Decimal时精度丢失,因此不能使用此构造方法进行转换。 解决Double类型在BigDecimal中精度丢失问题,使用string类型的构造...
  • 1,保留6位小数点NumberFormat format = NumberFormat.getInstance();...String s= format.format(double/BigDecimal); DecimalFormat df = new DecimalFormat("0.000000"); String ss= ...
  • Double转换BigDecimal进行运算

    千次阅读 2019-10-18 17:51:46
    由于double进行加减乘除运算容易丢失精度,所以一般把double转换BigDecimal进行调用BigDecimal的加减乘除方法进行运算之后在转成double类型 BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = ...
  • Double转换BigDecimal进行运算的整理

    千次阅读 2019-01-15 16:59:19
    Double转换BigDecimal进行运算的整理 由于double进行加减乘除运算容易丢失精度,所以一般把double转换BigDecimal进行调用BigDecimal的加减乘除方法进行运算之后在转成double类型 BigDecimal的运算(加减乘除)...
  • Double BigDecimal 转换

    千次阅读 2019-02-20 16:59:12
    BigDecimal 转换 Double(金额使用bigdecimal类型):摘自这里 double s=bigdecimal.doubleValue(); String 转换 BigDecimal:原作者传送门 BigDecimal bigDecimal=new BigDecimal(String); String string = ...
  • Double数据转化为BigDecimal,保证精度

    千次阅读 2020-06-07 12:16:11
    这是因为 0.1 无法准确地表示 double。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。 另一方面,String 构造方法是完全可预知的:写入 new BigDecimal(“0.1”) 将创建一个 BigDecimal,它...
  • bigdecimaldouble运算

    2021-02-24 09:08:11
    bigdecimaldouble运算 https://www.cnblogs.com/liuyk-code/p/6693002.html
  • JackSon Double类型转换为BigDecimal类型

    千次阅读 2019-12-16 16:01:11
    话不多说直接放代码: SimpleModule module = new ...module.addSerializer(Double.class, new StdSerializer(BigDecimal.class) { @Override public void serialize(Object o, JsonGenerator jsonGenerator,...
  • packagearchie2010;importjava.math.BigDecimal;importjava.math.MathContext;publicclassBigDecimalTest{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubdoubled1,d2;d1=0.10334;d2=...
  • 禁止使用构造方法BigDecimal(double)的方式把double转化为BigDecimal对象 在做双精度浮点数运算时,出现了精度错误,导致出现结果12.000…01的结果,网上找了下解决办法,使用BigDecimal可以解决浮点数运算精度...
  • Java中doubleBigDecimal的注意事项

    万次阅读 多人点赞 2018-08-10 16:01:20
    先上结论:不要直接用double变量作为构造BigDecimal的参数。   线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3。 2,解析JSON并把这个数字保存在一个float变量。 3,把这个float...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,605
精华内容 11,842
关键字:

bigdecimal转化为double