将双精度转换为字符串分数(鞋码)

时间:2018-03-13 04:49:58

标签: java string type-conversion double

因此,对于我的项目,我必须编写一个方法来将double值转换为字符串。我理解如何通过多种方式做多种格式化选项。我感到困惑的是,如何将半尺寸(鞋子)变成分数版本,同时仍然将其转换为字符串。所以     10.5 回报     10 - 1/2

任何提示或有用的指示表示赞赏。对不起,如果这是一个愚蠢的问题,我还在学习。 :)

3 个答案:

答案 0 :(得分:1)

您可以使用模数运算符(%)来完成您的工作,该运算符在Java中可以与浮点值一起使用。如果你执行shoeSize%1,你将得到0.5的半尺寸和0.0与其他尺寸,所以你只需要检查该值,以便将“1/2”添加到字符串表示中。这是一个简单的例子

public class ShoeSize {
    double size;
    public ShoeSize(double size) { this.size = size; }

    public String toString() {
        return "" + (int)size + (size % 1 == 0.5? " 1/2" : "");
    }

    public static void main(String args[]) {
        ShoeSize ss1 = new ShoeSize(10.5);
        ShoeSize ss2 = new ShoeSize(11);
        ShoeSize ss3 = new ShoeSize(11.5);

        System.out.println(ss1);
        System.out.println(ss2);
        System.out.println(ss3);
    }
}

上一代码的结果是:

10 1/2
11
11 1/2

然而,你真的不应该采用这种方法。这是因为根据您管理鞋子尺寸值的方式,它可能导致不可预测的结果,因为浮点值中的算术不是精确的,因为它是整数值。如下所示的一些简单操作可能会引入足够的错误,因此结果不符合您的预期:

...

public static void main(String args[]) {
    ShoeSize ss = new ShoeSize(10.0);
    ss.size += 0.1 + 0.2 + 0.3; // Sum it half

    System.out.println(ss);
}

此代码现在打印10而不是10 1/2。

你应该怎么做?嗯,有几种方法。例如,您可以将鞋子尺寸存储在代表的内部,每个单位代表一半。如果您具有addSize或subtracts等操作,则此内部表示将非常容易出错。唯一的问题是阅读用户的大小;最好的方法可能是有一个预定义大小的列表供用户选择。这是一个例子:

public class ShoeSize {
    int halves;

    public ShoeSize(double size) { this.halves = (int)(size * 2); }

    public String toString() {
        return "" + (halves / 2) + (halves % 2 == 1? " 1/2": "");
    }

    public static void main(String args[]) {
        ShoeSize ss = new ShoeSize(10.5);
        System.out.println(ss);
    }
}

更好的是,由于鞋子尺寸在某些值之间非常有限,您可以在单个枚举中表示它们的值。每个枚举都可以用人类可读的大小字符串(例如“10 1/2”)构建,并且鞋子尺寸无效也不会出现问题。这种方法唯一的问题是需要定义一个自定义方法来获得下一个和以前的鞋号,但这里有一个问题可以帮助你: [What's the best way to implement `next` and `previous` on an enum type?

答案 1 :(得分:0)

试试这个

public String getShoeSize(double size) {
    int s = (int)size;
    String shoeSize = Integer.toString(s);
    //check if it is a half value
    if(size > s) {
        shoeSize += " - 1/2";
    }
    return shoeSize;
}

答案 2 :(得分:0)

首先将double的值转换为string并将其拆分:

double d=10.5;
String s = String.valueOf(d);
String[] newstr =s.split(".");

然后如果分数有限,则使用开关盒为.5,.25,.75 但它没有限制,如果您可以按照以下步骤简化分数: 注意这一点,也许你的号码不是点符号,例如10必须考虑在交换机情况下

1.找到num和den的gcd,所以你有gcd = GCDFind(gcd,num);

2.现在,如果gcd == 1,那么分数不能简化(它已经是简化形式)。

3.if gcd> 1,然后newNum = num / gcd;和newDen = den / gcd;

限制的例子:

double s = 10.25;
        String aString = Double.toString(s);
        String[] fraction = aString.split("\\.");

        int denominator = (int)Math.pow(10, fraction[1].length());
        int numerator = Integer.parseInt(fraction[0] + "" + fraction[1]);
        int t=numerator%denominator;

        switch(t){
            case 0: System.out.println(numerator/denominator);break; //example : 10
            case 5: System.out.println(numerator/denominator + " - " +"1/2");break; //example : 10.5
            case 25: System.out.println(numerator/denominator + " - " +"1/4");break; //example : 10.25
            case 75: System.out.println(numerator/denominator + " - " +"3/4");break; //example : 10.75
            default:System.out.println("Not in 1/2, 1/4 or 3/4");
        }