Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将字符串转换为小数点后两位的十进制数_Java_String_Floating Point_Number Formatting - Fatal编程技术网

在Java中将字符串转换为小数点后两位的十进制数

在Java中将字符串转换为小数点后两位的十进制数,java,string,floating-point,number-formatting,Java,String,Floating Point,Number Formatting,在Java中,我试图将格式为“####.##”的字符串解析为浮点。字符串应始终具有2位小数 即使字符串的值为123.00,浮点值也应为123.00,而不是123.0 这就是我到目前为止所做的: System.out.println("string liters of petrol putting in preferences is " + stringLitersOfPetrol); Float litersOfPetrol = Float.parseFloat(stringLitersOfP

在Java中,我试图将格式为“####.##”的字符串解析为浮点。字符串应始终具有2位小数

即使字符串的值为
123.00
,浮点值也应为
123.00
,而不是
123.0

这就是我到目前为止所做的:

System.out.println("string liters of petrol putting in preferences is " + stringLitersOfPetrol);

Float litersOfPetrol = Float.parseFloat(stringLitersOfPetrol);

DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);

litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

System.out.println("liters of petrol before putting in editor: " + litersOfPetrol);
它打印:

string liters of petrol putting in preferences is 010.00 
liters of petrol before putting in editor: 10.0
问题在于它返回一个新的
浮点值

返回一个初始化为指定字符串表示的值的新浮点,该值由类float的valueOf方法执行。

您设置格式只是为了显示。这并不意味着
float
将在内部用相同的格式表示

你可以用

我不知道你为什么要使用
parseFloat()
两次。如果您想以某种格式显示
float
,只需格式化并显示即可

Float litersOfPetrol=Float.parseFloat(stringLitersOfPetrol);
DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);
System.out.println("liters of petrol before putting in editor"+df.format(litersOfPetrol));

使用
BigDecimal

new BigDecimal(theInputString);
它保留所有十进制数字。您可以确定精确的表示形式,因为它使用十进制,而不是二进制来存储精度/比例/等等

而且它不会像
float
double
那样受到精度损失的影响,除非您明确要求它这样做

litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

System.out.println("liters of petrol before putting in editor : "+litersOfPetrol);
您在此处打印的
浮动
,完全没有格式

要打印格式化的浮点,只需使用

String formatted = df.format(litersOfPetrol);
System.out.println("liters of petrol before putting in editor : " + formatted);

这是你的问题:

litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));
在这里,您根据需要将浮点格式设置为字符串,但随后该字符串再次转换为浮点格式,然后您在stdout中打印的是具有标准格式的浮点格式。看看这个代码

import java.text.DecimalFormat;

String stringLitersOfPetrol = "123.00";
System.out.println("string liters of petrol putting in preferences is "+stringLitersOfPetrol);
Float litersOfPetrol=Float.parseFloat(stringLitersOfPetrol);
DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);
stringLitersOfPetrol = df.format(litersOfPetrol);
System.out.println("liters of petrol before putting in editor : "+stringLitersOfPetrol);
顺便说一句,当你想使用小数时,就像其他人建议的那样,忘记double和float的存在,只使用BigDecimal对象,这会让你省去很多麻烦

我只想确保在转换字符串后,浮点数也将有2位小数

不能,因为浮点数没有小数位数。它们有二进制位,与小数位不相称


如果需要小数位数,请使用十进制基数。

Java将字符串转换为十进制:

String dennis = "0.00000008880000";
double f = Double.parseDouble(dennis);
System.out.println(f);
System.out.println(String.format("%.7f", f));
System.out.println(String.format("%.9f", new BigDecimal(f)));
System.out.println(String.format("%.35f", new BigDecimal(f)));
System.out.println(String.format("%.2f", new BigDecimal(f)));
这张照片是:

8.88E-8
0.0000001
0.000000089
0.00000008880000000000000106383001366
0.00

不要再解析格式化字符串了,也许?
setMinimumFractionDigits
听起来更合适。不要解析到无法使用float和double完成的float。BigDecimal可以做到这一点。如果不能使用float或double,有没有其他方法来保留传入字符串的2位小数?我怀疑有两位小数,精度损失是一个问题,我知道,但如果只处理两位小数,这将永远不会是一个问题。即使是整数也不是那么不准确,即使“只有”两位小数,正如你所说,这是一个问题。既然IEEE754一开始不是十进制的,而是二进制的。为什么Double.parsedouble(“2.30”)返回2.3?而不是2点30分?谢谢!我得到了它!现在我使用java.lang.BigDecimal而不是floatDouble.parsedouble(“2.30”)为什么返回2.3?而不是2.30?是不是不一样?为什么Double.parsedouble(“2.30”)返回2.3?而不是2点30分?