【问题标题】:Print double with 3, 2 and 1 decimal spaces with / and % only仅使用 / 和 % 打印带有 3、2 和 1 个小数位的双精度
【发布时间】:2018-03-04 10:30:08
【问题描述】:

我有一个号码1349.9431。如何仅使用除法 (/) 和模数 (%) 运算符打印具有 3 个小数位、2 个小数位和 1 个小数位的数字?

每当我尝试除法或使用模数时,我都会得到一些疯狂的数字,例如:13499.430999999999

【问题讨论】:

  • DecimalFormat
  • @AniketSahrawat 重点是“只使用除(/)和模(%)运算符”
  • @TobiasWeimer 我不明白。你的观点是什么?
  • @TobiasWeimer 我认为这不值得讨论,我已经阅读了这个问题。我仍然会推荐使用NumberFormatDecimalFormat
  • @AniketSahrawat 所以再读一遍问题,他不允许使用 DecimalFormat。

标签: java number-formatting


【解决方案1】:

好吧,由于double 格式的限制,这有点棘手,但我使用它完成了它。请注意,它可能不精确。

public static void main(String[] args) {
    double d = 1349.9431;
    System.out.println(d);
    d /= 0.0001;
    System.out.println(d);
    int i = (int)d;
    System.out.println(i);
    i -= i % 100;
    System.out.println(i);
    d = i / 10000d;
    System.out.println(d);
}

【讨论】:

  • 您知道像您正在做的那样将 double 转换为 int 可能会产生奇怪的结果吗?有很多角点你必须检查。即使在这里使用String.format() 也没有意义。
  • @roundAbout 是的,我知道这一点,我指出“它可能不精确”。这不是我编写代码的方式,但考虑到给定的限制,我没有看到其他方式。
【解决方案2】:

仅使用 / 运算符,保留 3 个小数点:

double x = 1349.9431;
x /= 0.001;
long y = (long) y; // downcast to an integer
double z = (double) y / 1000;

System.out.println(threeDecimal);
// 1349.943

【讨论】:

    猜你喜欢
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2011-12-25
    • 2014-10-10
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多