如何使用此api
假设字符串包含类似“10.1234”的字符串,从具有一定精度的字符串中读取double值(例如4)答案 0 :(得分:4)
如果您想要小数精度, double
是错误的目标类型,因为它是一种无法准确表示大多数小数小数的二进制格式。 double
值实际上将四舍五入为10.123399999999999999976
相反,请始终使用BigDecimal
,或者在阅读和操作数据时忘记粗略,并在打印结果时将其舍入。
答案 1 :(得分:3)
System.out.println(new Double(new BigDecimal("10.123456789").
setScale(4, BigDecimal.ROUND_DOWN). // choose precision and specify rounding policy
doubleValue()
));
>> run:
10.1234
答案 2 :(得分:0)
您可以执行类似
的操作Math.round(数字* 100)/ 100
获得精度,但由于浮点数和双精度数的内部表示,这可能无法达到你想要的效果。
如果您确实需要在小数点后使用固定位数,请考虑使用BigDecimal。
对于格式化输出,您可以使用this article中描述的类似C的printf功能。它不漂亮但实用。
答案 3 :(得分:0)
我假设您的String也包含字母。 您可以先解析字符串中的数字:
String numberString = ...
int precision = ...
int index = numberString.indexOf(".");
numberString = numberString.substring(0, index+precision+1); // Maybe without "+1"
Double number = Double.valueOf(numberString);
答案 4 :(得分:0)
您可以使用正则表达式将String
截断为小数点后最多4位数,然后使用Double.valueOf
。
String[] tests = {
"12",
"12.",
"12.3",
"12.34",
"12.345",
"12.3456",
"12.34567",
"-123.45678",
"1.23456.789.0",
};
for (String test : tests) {
String truncated = test.replaceAll("(\\.\\d{4}).*", "$1");
System.out.printf("%15s %15s %15s%n",
test, truncated, Double.valueOf(truncated)
);
}
打印:
12 12 12.0
12. 12. 12.0
12.3 12.3 12.3
12.34 12.34 12.34
12.345 12.345 12.345
12.3456 12.3456 12.3456
12.34567 12.3456 12.3456
-123.45678 -123.4567 -123.4567
1.23456.789.0 1.2345 1.2345
它会将.
文字\d{4}
,后跟最多四位\1
标记为.*
。它还会匹配$1
之后的所有其他内容,并使用\1
替换整个内容(反对所捕获的indexOf
)。
这比简单的{{1}}方法更有优势的是,即使没有4位数,或者甚至根本没有小数点,它也可以工作,无需特殊处理