Софтуерно Инженерство
Loading...
+ Нов въпрос
Vanadis avatar Vanadis 1 Точки

[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 променя нещата? Не е ли просто един плейсхолдър?

vancho avatar vancho 430 Точки

В Java за принтиране на различни типове данни се използват различни символи ако може така да го кажа:

- за принтиране на string -> %s

-  за принтиране на float, double -> %f (%.2f) // 16.05

- за цяло число - %d

и т.н.

При направен бърз тест, се оказва, че ако използваш %f го закръгля и одрязва до 6 символ след разделителя!

double a = 112.1212129913324325;
System.out.println(a);
System.out.printf("%f", a);

// output

112.12121299133243
112.121213

1
27/01/2017 17:06:34
Vanadis avatar Vanadis 1 Точки

 Т.е. %f подобрява точността? И затова само с него дава 100%?

0
27/01/2017 17:06:57
vancho avatar vancho 430 Точки

Дава 100%, защото така е нагласен judge и подаденият резултат е съвпаднал с търсеният. Принципно judge е нагласен повече за C# и има доста неща на Java, които трябва да донагаждаш. Иначе на Java double-a смята по-точно от на C#.

1
27/01/2017 17:12:34