在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

编译时,不管我传递的是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.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')
永远不能为真。