删除不必要的小数

时间:2015-01-13 14:39:50

标签: java decimal

我得到了这个从数据库中获取浮点数的代码。

for (int i = 0; i < ingredient.size() ; i++) {
    Ingredient ing = (Ingredient) ingredient.get(i);
    ingredients += String.valueOf(ing.getAmount()) + " " +
                   ing.getUnit() + " " + ing.getIngredient() + "\n";
}

数据库是用REAL值编写的,因为它们中的一些是1.5,2.5,1.4等。但是我们也有这些整数而不需要小数,例如1,4,10等。 问题是数据库表需要是REAL值,这使得我们别无选择,只能将所有值都指定为小数,无论是否需要。

所以我们最终得到的价值如下: 1.0 1.5 2.3 20.0 5.0

我的问题是:我们如何删除不必要的小数,但保留那些需要它的小数?

6 个答案:

答案 0 :(得分:0)

将从String返回的ing.getAmount()转换为Float对象,然后使用模数函数确定您的值是否是1的精确倍数(即无小数位)。如果是这样,请将Float对象转换为int,这将连接小数。

Float f = Float.valueOf(ing.getAmount());
if(f%1 == 0) {
    // Use f.intValue() to concatenate your decimals.
    ingredients +=String.valueOf(f.intValue() + " " + ing.getUnit() + " " + ing.getIngredient() + "\n";
}
else {
    ingredients +=String.valueOf(ing.getAmount()) + " " + ing.getUnit() + " " + ing.getIngredient() + "\n";
}

我希望这会有所帮助。

答案 1 :(得分:0)

删除这些的一种非常简单的方法是使用StringUtils去除字符。

String displayValue = String.valueOf(ing.getAmount());

displayValue = StringUtils.stripEnd(displayValue, ".0");

如果输入&#34; 1.0&#34; ,则会返回&#34; 1&#34;

更技术性的方法是使用模数运算符%

例如:

if(value%1 == 0){  //1 divides into number perfectly, there is no decimal
    //cast value to integer or another non decimal variable
} else {
    //use existing value as it contains a decimal
}

答案 2 :(得分:0)

这个怎么样(不需要任何奇特的东西,比如StringUtils)?

    String s = String.valueOf(1.0);
    System.out.println(s);

    /* Make this block as a function and return an int */
    String ss = " ";
    if (s.charAt(s.length()-2) == '.' && s.charAt(s.length()-1) == '0'){
        ss = s.substring(0,s.length()-2);
        System.out.println(ss);
    }
    /**************************************************/
    int converted = Integer.parseInt(ss);
    System.out.println(converted);

}

如果你想把它变成一个功能块,你可以。

您可以在IDEONE - http://ideone.com/udJv8M

上查看它

答案 3 :(得分:0)

用模数检查浮点值。如果返回0,则为整数。以下是您提到的数字的示例:

    List<Float> values = new ArrayList<Float>();
    values.add(new Float(1.0f));
    values.add(new Float(1.5f));
    values.add(new Float(2.3f));
    values.add(new Float(20.0f));
    values.add(new Float(5.0f));

    List<String> strValues = new ArrayList<String>();

    for(Float value : values)
    {
        String strValue = "";
        if(value % 1 == 0)
        {
            Integer intValue = value.intValue();
            strValue = intValue.toString();
            strValues.add(strValue);
        }
        else
        {
            strValue = value.toString();
            strValues.add(strValue);
        }

        System.out.println(strValue);
    }

答案 4 :(得分:0)

您可以使用custom DecimalFormat pattern

public static String customFormat(String pattern, double value) {
    DecimalFormat myFormatter = new DecimalFormat(pattern);
    return myFormatter.format(value);
}

然后#的模式定义了可选数字的占位符,因此#.###仅在必要时提供最多3位数字。

for (int i = 0; i < ingredient.size() ; i++) {
    Ingredient ing = (Ingredient) ingredient.get(i);
    ingredients += customFormat("#.###", ing.getAmount()) +
                   " " + ing.getUnit() + " " + ing.getIngredient() + "\n";
}

答案 5 :(得分:0)

因此,除了仅显示之外,不要将数据转换为字符串。实数可以使用相同的数据类型表示整数和浮点数。另外,如果您需要对数字进行任何数学计算,则不能使用字符串来执行此操作。如果您将数字从数据库直接转换为String,然后将它们存储到Ingredient中,那么如果您想对这些数字进行计算,那么您以后就已经搞砸了。 (假设您想要添加一个功能以使配方加倍并使用户的所有数量都发生变化)。根据你目前的计划,你会阻止自己做这样的事情,因为你过分专注于显示这个数字。

相反,只需在Ingredient上创建一个方法,使用String.format()转换数字。像这样:

 public class Ingredient {
     private double amount;
     private String name;

     public String asDecimal() {
         return String.format("%.1f", amount);
     }

     public String asInteger() {
         return String.format("%.0f", amount);
     }

     public String asFraction() {
         // exercise left to the reader
     }
 }

你甚至可以添加一个将小数转换为小数的函数,以便更容易显示酋长可能理解的事情与较小的小数。请记住String.format()将舍入浮点数(0.5 - > 1使用整数)。