之前可能会问太多次......但
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
,最好的方法是什么?
答案 0 :(得分:2)
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值的整体幅度和精度的信息,并返回符号相反的结果。
与此问题无关,当您需要从Integer
值实例化int
时,有时更快方式。
来自java.lang.Integer
class
文档:
public static Integer valueOf(int i)
返回表示指定int值的Integer实例。如果不需要新的Integer实例,通常应优先使用此方法,而不是构造函数Integer(int),因为此方法可能通过缓存频繁请求的值来显着提高空间和时间性能。此方法将始终缓存-128到127(包括端点)范围内的值,并可以缓存此范围之外的其他值。
答案 1 :(得分:1)
int x = (int) Double.parseDouble(s);
跑了3纳秒,
int y = new BigDecimal(s).intValue();
跑了8纳秒
答案 2 :(得分:0)
一个非常不正统的解决方案是:
Integer.parseInt(str.split("\\.")[0]);
但它适用于像#34; 74.09"和#34; 74"等等
答案 3 :(得分:0)
怎么样
Integer myNum = Integer.parseInt(str.substring(0,str.indexOf(“。”));
因为OP明确要求不舍入