对于英尺和英寸的浮动比较是不正确的



英尺和英寸表示为float,我希望5.7在这个场景中更大。如何处理,因为这返回1

Float f1 = Float.parseFloat("5.7");
Float f2 = Float.parseFloat("5.10");
System.out.println(f1.compareTo(f2));

我想我知道你的方法有什么缺陷了。

从字里行间看,我认为你想让"5.7"表示5英尺7英寸。实际上,你把它解析为float,它的意思是5 + 7/10英尺。同样,"5.10"表示5 + 1/10英尺。小于5.7

.注意,这是十进制数的正常含义…正如我们在小学所教的那样。(且5.7不小于5.10!)


现在…如果你想让5.7的意思是5英尺7英寸……您需要将字符串"5.7"分成两部分,将这两部分转换为整数并进行一些算术。

像这样:

String feetAndInches = "5.10";
String[] parts = feetAndInches.split("\.");
float feet = parseFloat(parts[0]);
if (parts.length == 1) {
feet += parseFloat(parts[1]) / 12;
}

但是…我的建议是不要那样做:

  1. 这个符号是非标准的。
  2. 如果小数点后的数字大于11,则打破
  3. 如果没有小数点,含义可能有歧义。
  4. 这个表示法不能提供一种用一英寸的分数表示长度的相同方法。

最后:

英尺和英寸表示为float…

它们不应该用浮点数表示。时期。

不使用浮点数,您应该创建自定义类来处理英尺和英寸,您可以将它们存储为整数。这个类还应该实现Comparable接口。

public class FeetAndInches implements Comparable<FeetAndInches> {
private int feet;
private int inches;
public FeetAndInches(String s) {
String[] parts = s.split("\.");
if (parts.length == 1) {
feet = Integer.parseInt(parts[0]);
inches = 0;
} else if (parts.length == 2) {
feet = Integer.parseInt(parts[0]);
inches = Integer.parseInt(parts[1]);
} else throw new IllegalArgumentException();
}
@Override
public int compareTo(FeetAndInches that) {
if (this.feet == that.feet) {
return Integer.compare(this.inches, that.inches);
} else {
return Integer.compare(this.feet, that.feet);
}
}
}

编辑:根据@user16632363评论,您只能以英寸为单位存储值:

public class FeetAndInches implements Comparable<FeetAndInches> {
private int inches;
public FeetAndInches(String s) {
String[] parts = s.split("\.");
if (parts.length == 1) {
inches = Integer.parseInt(parts[0]) * 12;
} else if (parts.length == 2) {
inches = Integer.parseInt(parts[0]) * 12 + Integer.parseInt(parts[1]);
} else throw new IllegalArgumentException();
}
@Override
public int compareTo(FeetAndInches that) {
return Integer.compare(this.inches, that.inches);
}
}

你可以这样使用这个类:

FeetAndInches f1 = new FeetAndInches("5");
FeetAndInches f2 = new FeetAndInches("5.10");
System.out.println(f1.compareTo(f2));

演示:https://ideone.com/aaiOT8

最新更新