Java 解析时不舍入是正常的吗?数字格式
为什么它不在解析过程中循环Java 解析时不舍入是正常的吗?数字格式,java,io,format,number-formatting,Java,Io,Format,Number Formatting,为什么它不在解析过程中循环 NumberFormat format = NumberFormat.getInstance(); System.out.println(format.getMaximumFractionDigits());// 3 System.out.println(format.getRoundingMode());// half even Double dob = (Double)format.parse("1212.35656"); System.out.println(d
NumberFormat format = NumberFormat.getInstance();
System.out.println(format.getMaximumFractionDigits());// 3
System.out.println(format.getRoundingMode());// half even
Double dob = (Double)format.parse("1212.35656");
System.out.println(dob);// output is 1212.35656
数字计数仅用于格式化。当你解析一个数字时,你总是会得到与输入最匹配的数字,即使它的位数比
NumberFormat
用来格式化的位数还要多
要解析字符串中的数字,然后将其四舍五入到给定的小数位数,可以使用java.math
包中的BigDecimal
:
BigDecimal bd = BigDecimal("1212.35656");
double dob = bd.setScale(3, RoundingMode.HALF_EVEN).doubleValue();
要获得您想要的,您需要调用加载的实现NumberFormat的格式化程序metod(在您的例子中是DecimalFromat);我只是在末尾添加了所需的行,并用main包装:
import java.text.NumberFormat;
public class NumberFormatRounding {
public static void main(String[] args) throws Exception{
NumberFormat formatter = NumberFormat.getInstance();
System.out.println(formatter.getMaximumFractionDigits());// 3
System.out.println(formatter.getRoundingMode());// half even
Double dob = (Double) formatter.parse("1212.35656");
System.out.println(dob);// output is 1212.35656
String formattedDob = formatter.format(dob.doubleValue());
System.out.println(formattedDob);// output is 1212.357
}
}
请注意,格式化的dob是一个字符串,但没有特殊原因吗?设计说明文档的这一部分,在参数中,似乎实际上表示
Parameters:newValue要显示的小数位数的最大数目;如果小于零,则使用零。具体的子类可能会对该值强制执行一个上限,该上限适用于正在格式化的数值类型。
这里,数值类型
似乎暗示仅用于格式化。我认为当前的行为是合理的:替代方案是默默地降低数字的精度(=坏),或者在输入的位数超过预期(=也坏)时引发异常