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

1
Programming Basics
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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.