[JAVA] Променя ли %f точността на double
С какво %f променя точността на double? Става дума, че float и double изглежда не са достатъчно точни при закръглянето. По тази причина при решаване на задачата към второто домашно - Зеленчуков магазин (16), системата за оценяване дава 90%, ако накрая просто принтнем резултата.
Условие на задачата:
Градинар продавал реколтата от градината си на зеленчуковата борса. Продава зеленчуци за N лева на килограм и плодове за M лева за килограм. Напишете програма, която да пресмята приходите от реколтата в евро ( ако приемем, че едно евро е равно на 1.94лв).
Решение:
package Izpiti;
import java.util.Scanner;
public class zelenchukowMagazin {
public static void main(String[]args){
Scanner scanner = new Scanner(System.in);
double vegyPriceInBGN = Double.parseDouble(scanner.nextLine());
double fruitsPriceInBGN = Double.parseDouble(scanner.nextLine());
int vegyKgs = Integer.parseInt(scanner.nextLine());
int fuitsKgs = Integer.parseInt(scanner.nextLine());
double vegyProfit = vegyPriceInBGN * vegyKgs;
double fruitsProfit = fruitsPriceInBGN * fuitsKgs;
double profitFinal = vegyProfit + fruitsProfit;
double BGNtoEURRatio = 1.94;
double profitInEUR = profitFinal / BGNtoEURRatio;
System.out.printf(profitInEUR);
}
}
Та в този случай джъдж дава 90%, поради проблем в закръглянето на големи числа и double.
След ровене насам тама, се оказва, че в Java за пари се използва BigDecimal и това е единият начин да се достигнат 100% (вж. сравнение между double и BigDecimal), но в същото време задачата достига 100% и ако продължим да си използваме double за реалните числа, но използваме System.out.printf ("%f", profitInEUR) накрая. В този случай %f някак оправя нещата и пак се почуват 100%. Разбирам какво прави BigDecimal, но как %f променя нещата? Не е ли просто един плейсхолдър?
Т.е. %f подобрява точността? И затова само с него дава 100%?
Дава 100%, защото така е нагласен judge и подаденият резултат е съвпаднал с търсеният. Принципно judge е нагласен повече за C# и има доста неща на Java, които трябва да донагаждаш. Иначе на Java double-a смята по-точно от на C#.