【问题标题】:How to check if a number has decimal places to the thousandths place or more?如何检查一个数字是否有小数位到千分位或更多?
【发布时间】:2020-09-30 22:04:23
【问题描述】:

我正在开发一个程序,该程序可以打印工人所赚取的工资,包括加班费。我几乎完成了这个程序。但是,我被困在如何设定条件将工资中的小数位固定到十分位和百分之一(.00)

我想要的条件是,如果工作小时数大于 40 并且加班工资有千分之一或更多的数字(overTimeWages has .000 or more .0000000000....),那么System.out.println("$" + (Math.floor(overTimeWages * 100) / 100));overTimeWages 舍入到最接近的百分之一。我只想要十分位和百分之一的值。否则如果工作时间大于 40 并且加班工资只有十分位和百分之一的数字,那么System.out.println("$" + overTimeWages + 0);

我如何在上面设置这个条件?

我尝试了overTimeWages % 0.1 != 0;,但没有成功。

下面的代码 cmets 是应该输入的值。

代码

import java.util.Scanner;

int payRateInCents, payRateInDollars,
    hoursWorked, 
    overTimeHours, grossPayWithInt;
  
double grossPay, payRCents, payRDollars, overTimeRate;

grossPay = (double) ((payRDollars * hoursWorked));
grossPayWithInt = (payRateInCents * 40);
double grossPayWithOverTime = (double) ((grossPayWithInt) + (overTimeRate * overTimeHours));
double overTimeWages = (double) (grossPayWithOverTime / 100);

/**
   2000 45 = (2000 * 40) + ((2000 * 1.5) * (45 - 40)) == 95000
   2000 45 = (grossPayWithOverTime) + ((overTimeRate) * (overTimeHours)) == 95000
   Then divide by 100.
   
   2000 40 should get: $800.00
   1640 41 should get: $680.60
   3111 43 should get: $1384.39
   1005 1 should get: $10.05
  **/

if(hoursWorked > 40) {
    if(overTimeWages % 0.1 != 0) {
      System.out.println("$" + (Math.floor(overTimeWages * 100) / 100));
    } else {
      System.out.println("$" + overTimeWages + 0);
    }
  }
  
  else {
    if(hoursWorked < 10) {
      System.out.println("$" + grossPay);
    } else {
      System.out.println("$" + grossPay + 0);//40 or lower
    }
  }

【问题讨论】:

  • doubles 和 floats 并不总是有精确的值,所以如果你真的关心 sig figs 和所有的东西,你可能想要使用类似 BigDecimal
  • 如何在 if 语句中使用BigDecimal
  • 你到底想在这里做什么?测试“如果它有超过 2 个小数位”是没有意义的——这是一个渲染问题,而不是数据问题。您是要将值四舍五入到最多 2 位小数,还是只显示 2,还是什么?

标签: java drjava


【解决方案1】:

不要将分数或浮点数用于任何会持有货币的变量。由于浮点数的存储方式,对浮点数的操作会给您带来意想不到的结果。您认为 1.2 是 1.2,但实际上它可能是 1.19999999。这就是花车的工作原理。 我建议在处理金钱时不要进入任何分数。用 130 美分代替 1.30 美元。

为了显示的目的,转换它是微不足道的:

private static DecimalFormat df = new DecimalFormat("#.##");
Syste.out.println(df.format(yourDouble));

查看数字有多少个小数。

String[] split = yourDouble.toString().split("\\.");
split[0].length();   
split[1].length();

【讨论】:

  • 好的,所以 DecimalFormat 的作用与 BigDecimal 相同,但我如何将其放入 if else 语句中?我只想检查我的overTimeWages 是否超过千分之一。
  • 如果你想知道double有多少个小数,你可以把它转换成String,在'.'上分割。并检查长度。我编辑了答案以包含该代码。
  • Java 输出一个错误,上面写着:“1 error found: Error: Cannot invoke toString() on the original type double”
  • String.valueOf(yourDouble) 而不是 yourDouble.toString() 我认为。
  • 对于双重(原始),就像史蒂夫所说的(String.valueOf(yourDouble))。对于 Double (Object),您使用 yourDouble.toString()
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2014-03-04
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多