我正在尝试将字符串转换为BigDecimal。请告诉下面哪一个是好approch
BigDecimal selAmount = BigDecimal.ZERO;
String amount = "1234";
selAmount = BigDecimal.valueOf(Double.parseDouble(amount));
或
selAmount = new BigDecimal(amount);
答案 0 :(得分:1)
不要使用第一种方法。如果字符串表示无法由double
准确表示的值,则会出现准确性问题。
您也不能使用第二种方法,因为BigDecimal.valueOf
没有接受字符串的重载。
所以,选项3:
BigDecimal selAmount = new BigDecimal(amount);
答案 1 :(得分:0)
您可以将字符串直接传递给BigDecimal的构造函数。
答案 2 :(得分:0)
BigDecimal.valueOf(double));
隐式调用return new BigDecimal(Double.toString(val));
。所以,你的第二个案例会更有效率,正如Thilo所说,更多正确。
代码:
*/
public static BigDecimal valueOf(double val) {
// Reminder: a zero double returns '0.0', so we cannot fastpath
// to use the constant ZERO. This might be important enough to
// justify a factory approach, a cache, or a few private
// constants, later.
return new BigDecimal(Double.toString(val));
}
答案 3 :(得分:0)
第二种方法最好继续,只需将字符串传递给BigDecimal的构造函数即可。第一种方法可能存在精确问题。
来自JavaDocs
public BigDecimal(String val)
将BigDecimal的字符串表示转换为 BigDecimal的。字符串表示由可选符号组成, ' +' (' \ u002B')或' - ' (' \ u002D'),后跟一个零或0的序列 更多十进制数字("整数"),可选地后跟a 分数,可选地后跟一个指数。
答案 4 :(得分:0)
将字符串作为构造函数传递是更好的方法。在第一种情况下,你将失去精确度。
e.g
String s =“123”;
BigDecimal bigDecimal = new BigDecimal(s);