【问题标题】:Change 1.0, 2.0 like float values to 1 , 2 | remove trailing zeros from floating binary point types将 1.0, 2.0 之类的浮点值更改为 1 , 2 |从浮点二进制点类型中删除尾随零
【发布时间】:2018-01-23 07:25:50
【问题描述】:

我从 API 调用接收double 值。该方法返回这种值2.02.3442.0343.1 等。

如果我收到2.04.0 之类的值,我想将它们转换为24。我只需要在2.03.0 之类的值上进行这种转换。

我怎样才能做到这一点?

【问题讨论】:

  • 听起来您应该查看DecimalFormat,假设您正在讨论将double 值格式化为字符串。

标签: java string int double


【解决方案1】:

假设这是将double格式化String 的问题,确保没有尾随无关紧要的零,我建议使用DecimalFormat 来控制格式。例如:

import java.text.*;
import java.util.*;

class Test {
    public static void main(String[] args) throws Exception {
        print(5.0d);
        print(5.000000001d);
        print(5.1d);
        print(123456789.1d);
        print(12345e-50);
    }

    private static void print(double value) {
        NumberFormat format = new DecimalFormat(
            "0.############",
            DecimalFormatSymbols.getInstance(Locale.US));
        String text = format.format(value);
        System.out.println(text);
    }
}

注意Locale.US 的使用总是以点作为小数分隔符。

main 中的最后一个示例显示了此处的限制 - 非常接近 0 的数字将被格式化为“0”,因为我没有提供足够的可选数字(# 部分)来更恰当地格式化它们。不过,在这些情况下你想要什么还不清楚;默认表示为1.2345E-46

【讨论】:

  • 我注意到这个方法比回答一个非常简单。你能解释一下这种方法的内部行为吗? ?
  • @uma:我不知道 DecimalFormat 的内部结构——我只是按照它记录在案的行为。我认为它工作正常,这意味着我们可以让它做我们想做的事情:)
【解决方案2】:

你不能使用floatdouble来存储,因为它们是浮点类型,会导致1.02.0等。你可以使用String来存储一个格式化的值:

double myDouble = 3.0D;
String i = myDouble == 0.0 ? "0" : myDouble / Math.floor(myDouble) == 1.0 ? String.format("%.0f", myDouble) : String.valueOf(myDouble);
System.out.println(i);

【讨论】:

  • 我认为使用省略尾随数字的DecimalFormat 会更明智。 IMO,您当前的操作方式存在太多潜在问题。 (我还建议不要使用"" + ... 作为将值转换为字符串的一种方式 - 代码使用空字符串和字符串连接,两者都不相关。我会使用String.valueOf(...),它准确地说明了你的意思'正在努力实现。)
  • 我不是你认为的相关性。
  • @JonSkeet 您现在可能想考虑删除您的反对票。
  • 不,因为我仍然认为这是检查整数的糟糕方法,而且这种字符串处理比使用DecimalFormat 的专用格式化机制更糟糕。
猜你喜欢
  • 2017-09-19
  • 2018-11-15
  • 2018-10-17
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2021-10-11
  • 2017-02-23
相关资源
最近更新 更多