问题描述
这可能问了太多遍了,但是...
String str = "74.0";
假设我有"74.05"
而我只需要74
。
下面是我的一些方法。
Integer.parseInt(str); //would result to java.lang.NumberFormatException
(int) Double.parseDouble(str); //working
new BigDecimal(str).intValue(); //I like this
我想将此字符串( str
)转换为int
或Integer
,最好的方法是什么?
1楼
java.lang.NumberFormatException
是由于您试图将double
精度文字转换为int
类型而引起的。
没有最好的方法,但是使用
Double.parseDouble("74.05");
代替
Double.valueOf("74.05");
取决于您是否需要double
基本类型或Double
对象类型。
如果需要整数类型,可以将double值四舍五入,如下所示:
Math.round(Double.parseDouble("74.05"));
或只是将double
精度转换为仅获得整数部分
(int)Double.parseDouble("74.05")
new BigDecimal(str).intValue();
无疑是最糟糕的选择,因为它可能导致Oracle文档中所述的意外结果(请参见粗体):
public int intValue()
将此BigDecimal转换为int。 此转换类似于Java?语言规范的5.1.3节中定义的从double到short的原始缩元转换:该BigDecimal的任何小数部分都将被丢弃,并且如果生成的“ BigInteger”太大而无法放入。 int,仅返回低阶32位。 请注意,此转换可能会丢失有关此BigDecimal值的整体大小和精度的信息,并返回带有相反符号的结果 。
与问题无关,当需要从int
值实例化Integer
时,有一种更快的方法。
从java.lang.Integer
class
文档中:
public static Integer valueOf(int i)
返回表示指定int值的Integer实例。 如果不需要新的Integer实例,则通常应优先于构造方法Integer(int)使用此方法,因为此方法通过缓存经常请求的值可能会产生明显更好的空间和时间性能。 此方法将始终缓存-128至127(包括)范围内的值,并且可能缓存该范围之外的其他值。
2楼
int x = (int) Double.parseDouble(s);
跑了3纳秒
int y = new BigDecimal(s).intValue();
跑了8纳秒
3楼
一个真正非常规的解决方案是:
Integer.parseInt(str.split("\\.")[0]);
但它适用于“ 74.09”这样的字符串和“ 74”这样的字符串,依此类推
4楼
怎么样
整数myNum = Integer.parseInt(str.substring(0,str.indexOf(“。”)));
因为OP明确希望不进行舍入