在Java中编译时可能发生的有损转换
编译时,不管我传递的是int还是float,它都会给出可能的有损转换错误。。这里的问题是什么?在Java中,默认情况下,每个十进制数都被认为是双精度的。将在Java中编译时可能发生的有损转换,java,Java,编译时,不管我传递的是int还是float,它都会给出可能的有损转换错误。。这里的问题是什么?在Java中,默认情况下,每个十进制数都被认为是双精度的。将浮点值乘以双精度,结果是双精度: import java.util.*; import java.util.Scanner; class Main { public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); System.out.pr
浮点值
乘以双精度
,结果是双精度
:
import java.util.*;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
System.out.println("Enter price: $");
float price = keyboard.nextFloat();
System.out.println("Early payment (Y/N): ");
String char1 = keyboard.nextLine();
float amount = price;
if (char1.equals('Y'))
{
amount = price * 0.9;
}
System.out.printf("Amount due: $%0.2f\n", amount);
}
}
float result = price * 0.9f;
在这里,我们有两个选择。第一个是将0.9转换为float
,将f
放在数字前面:
float price = 10.7f;
float result = price * 0.9; //this does not work
第二个选项是将结果保持为双精度:
import java.util.*;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
System.out.println("Enter price: $");
float price = keyboard.nextFloat();
System.out.println("Early payment (Y/N): ");
String char1 = keyboard.nextLine();
float amount = price;
if (char1.equals('Y'))
{
amount = price * 0.9;
}
System.out.printf("Amount due: $%0.2f\n", amount);
}
}
float result = price * 0.9f;
请仅在进行简单测试时使用
double/float
。我们对Double
和bigdecimic
之间的差异有一个很好的解释:主要问题是0.9
是Double
,这导致price*0.9
的值也被强制为Double
。为了防止出现这种情况,您应该使用0.9f
来表示您需要float
类型
您还存在char1
实际上是字符串而不是char
的问题,因此char1.equals('Y')
将始终是false
此外,您的%0.2f
格式表示您希望零填充输出,但忽略了指定最小宽度。类似于%04.2f
的东西应该可以工作
double result = price * 0.9;
问题是
0.9
是double
文本,而不是float
文本,您应该使用0.9f
char1。equals('Y')
永远不能为真。