在java中将字符串转换为BigDecimal

时间:2015-02-28 16:20:06

标签: java bigdecimal

我正在从XML读取货币到Java。

String currency = 135.69;

当我将其转换为BigDecimal时,我得到:

 System.out.println(new BigDecimal(135.69));

输出:

135.68999999999999772626324556767940521240234375.

为什么输出这么多数字呢?我怎么能避免这个?我想要的只是输出135.69。

8 个答案:

答案 0 :(得分:61)

BigDecimal(double)构造函数有一些问题,最好使用BigDecimal(String)或BigDecimal.valueOf(double)。

System.out.println(new BigDecimal(135.69)); //135.68999999999999772626324556767940521240234375
System.out.println(new BigDecimal("135.69")); // 135.69
System.out.println(BigDecimal.valueOf(135.69)); // 135.69

BigDecimal(double)文档解释了这种行为:

  
      
  1. 此构造函数的结果可能有些不可预测。有人可能会假设在Java中编写新的BigDecimal(0.1)会创建一个BigDecimal,它恰好等于0.1(未缩放值为1,标度为1),但它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能精确地表示为double(或者,就此而言,作为任何有限长度的二进制分数)。因此,传递给构造函数的值并不完全等于0.1,尽管有外观。
  2.   
  3. 另一方面,String构造函数是完全可预测的:编写新的BigDecimal(" 0.1")会创建一个BigDecimal,它正好等于0.1,正如人们所期望的那样。因此,通常建议首先使用String构造函数。
  4.   
  5. 当必须将double用作BigDecimal的源时,请注意此构造函数提供了精确的转换;它不会产生与使用Double.toString(double)方法将double转换为String然后使用BigDecimal(String)构造函数相同的结果。要获得该结果,请使用static valueOf(double)方法。
  6.   

答案 1 :(得分:15)

String currency = "135.69";
System.out.println(new BigDecimal(currency));

//will print 135.69

答案 2 :(得分:3)

BigDecimal(String)

在 Java 中将 String 转换为 BigDecimal 的最简单方法是使用 BigDecimal(String) 构造函数

String number = "123.45";
BigDecimal bigDecimal = new BigDecimal(number);

BigDecimal.valueOf()

我们还可以使用 BigDecimal.valueOf(double) 方法将 String 转换为 BigDecimal

这是一个两步过程。第一步是将String 转换为Double。第二步是将Double 转换为BigDecimal

String number = "123.45";
BigDecimal bigDecimal = BigDecimal.valueOf(Double.valueOf(number));

DecimalFormat.parse()

当表示值的 String 具有更复杂的格式时,我们可以使用 DecimalFormat

例如,我们可以在不删除非数字符号的情况下转换基于十进制的 long 值:

BigDecimal bigDecimal = new BigDecimal(123456.789).setScale(3, BigDecimal.ROUND_HALF_UP);

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(',');
symbols.setDecimalSeparator('.');
String pattern = "#,##0.0#";
DecimalFormat decimalFormat = new DecimalFormat(pattern, symbols);
decimalFormat.setParseBigDecimal(true);

// parse the string value
BigDecimal parsedStringValue = (BigDecimal) decimalFormat.parse("123,456.789");

assertEquals(bigDecimal, parsedStringValue);

DecimalFormat.parse 方法返回一个 Number,我们使用 setParseBigDecimal(true)< 将其转换为 BigDecimal 数字/em>;

通常,DecimalFormat 比我们需要的更高级。因此,我们应该支持新的 BigDecimal(String)BigDecimal.valueOf()

答案 3 :(得分:2)

我可以添加一些东西。如果你使用货币,你应该使用Scale(2),你应该找出一个圆形方法。

答案 4 :(得分:2)

您正在以货币形式存储135.69作为String。但是,您没有传递可变货币,而是再次将135.69(双值)传递给新的BigDecimal()。 因此,您在输出中看到很多数字。 如果传递currency变量,则输出为135.69

答案 5 :(得分:1)

BigDecimal b = BigDecimal.valueOf(d);

import java.math.*; 

public class Test { 

    public static void main(String[] args) 
    { 

        // Creating a Double Object 
        Double d = new Double("785.254"); 

        /// Assigning the bigdecimal value of ln to b 
        BigDecimal b = BigDecimal.valueOf(d); 

        // Displaying BigDecimal value 
        System.out.println("The Converted BigDecimal value is: " + b); 
    } 
}

答案 6 :(得分:0)

Spring Framework提供了一个出色的utils类来实现这一目标。

实用程序类:NumberUtils

字符串到BigDecimal的转换-

NumberUtils.parseNumber("135.00", BigDecimal.class);

答案 7 :(得分:-3)

您好,您不能直接将字符串转换为bigdecimal

您需要先将其转换为很长的时间,然后您才能转换为大十进制

String currency = "135.69"; 
Long rate1=Long.valueOf((currency ));            
System.out.println(BigDecimal.valueOf(rate1));