#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
.