如何检查数字的小数位至千位以上?

问题描述

我正在开发一个程序,打印出工人赚的工资,包括加班费。我几乎完成了该程序。但是,我坚持如何创造条件将工资中的小数部分固定为百分之一(.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;,但是没有用。

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

代码

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
    }
  }

解决方法

不要对任何持有货币的变量使用分数或浮点数。由于如何存储浮点数,对浮点数的操作将给您带来意想不到的结果。您认为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();