Получение WA, несмотря на написание правильного кода с правильным выводом

#java

#java

Вопрос:

Это основной вопрос codechef: Пуджа хотел бы снять X $US деньги в банкомате. Банкомат примет транзакцию только в том случае, если она X кратна 5, а на балансе счета Пуджи достаточно наличных для выполнения операции по снятию средств (включая банковские сборы). За каждый успешный вывод средств банк взимает 0.50 $US плату. Рассчитайте баланс счета Пуджи после попытки транзакции «.

Это мой код:

 import java.util.Scanner;
public class Main
{
public static void main(String args[]){
 Scanner s= new Scanner(System.in);
 double withdraw = s.nextDouble();      double balance = s.nextDouble();
 if((withdraw%5==0) amp;amp; balance>=(withdraw 0.50))
 System.out.println("Balance: " (balance-withdraw-0.50));
 else
 System.out.println("Balance: " balance);
}
}
 

Это дает правильный результат, но я все равно получаю неправильный ответ

Комментарии:

1. Можете ли вы опубликовать ожидаемые входные и выходные данные? Возможно, вы пропустили детали, например, существует более 1 тестового примера.

Ответ №1:

Я думаю, вам нужно проверить, если вывод средств> 0.

Ответ №2:

Остерегайтесь модуля, чисел с плавающей запятой и сравнения чисел с плавающей запятой с помощью «=». Безопаснее преобразовать входные данные в long (путем умножения на 100 и использования центов вместо $ s). Это может избежать некоторых неприятных ошибок округления >= 0.50 , которые теперь всегда будут точными и похожими >= 50 . При производстве продукции вам придется снова конвертировать ее в доллары:

   static long dollarsToCents(double dollars) { return (long)(dollars*100); }
  
  static String centsAsDollars(long cents) { return ""   (cents/100)   "."   (cents%100); }
 

Маловероятно, что проблема связана с этим, но посмотрите на следующий пример:

     double d = 5_000_000_000_000_000.0; // 5 * 10^15
    double e = 0.5;
    double f = d   e;
    System.out.println(""   d   "   "   e   " = "   f);
    System.out.println("both are equal?: "   (d == f));    // true


    long a = dollarsToCents(d);
    long b = dollarsToCents(e);
    long c = a   b;
    System.out.println(""   a   "   "   b   " = "   c);
    System.out.println("both are equal?: "   (a == c));    // false
 

Для повышения безопасности (и если вам когда-либо придется обрабатывать деньги в программе), используйте BigDecimal . Однако они намного медленнее, чем целые числа фиксированного размера, такие как long .