Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Проблем с Java калкулатор

Featured Replies

Здравейте, 

опитвам се да си направя собствен калкулатор с помощта на Netbeans и jFrame Form. Когато изчислявам sin в градуси (например: sin(180)) ми дава следния отговор: 1.2246467991473532E-16. Защо се получава така и как може да се оправи ? При изчисляване в радиани няма проблем или поне досега не съм открил. 

firstnum  = (Double.parseDouble(String.valueOf(display.getText())));
           firstnum  = firstnum*Math.PI/180;

Благодаря предварително за помощта !

 

Поздрави

Колко е PI ?

 

Вземи PI с по голяма точност


Виж от някой справочник колко е PI. Вземи PI с точност до максималната за типа double


Не използвай Math.PI

 

Ако и това не помогне, а ти трябва непременно синус от 180 да е 0, тогава въведи праг. Например ако се получи число по малко от еди каква си стойност, тогава се е получила нула.

Редактирано от Реджеп Иведик (преглед на промените)

...

Здравейте, 

 

За този конкретен проблем, решението е използването на логика за закръгляне:

Пример 1 - наивен метод:

public static double customRound(double value, int precision) {
        if (precision > 0) {
            double delim = Math.pow(10, precision);
            return Math.round(value*delim)/delim;
        } else {
            return value;
        }
    }

Този метод ще има проблеми, ако трябва да се закръгля до много голяма точност или double числото е достатъчно голямо.

По съвети на по-напредналите програмисти, за да се избегнат тези потенциални проблеми, може да се ползва BigDecimal:

public static double customRoundSafe(double value, int precision) {
        if (precision > 0) {
            java.math.BigDecimal bd = new java.math.BigDecimal(value);
            bd = bd.setScale(precision, java.math.RoundingMode.HALF_UP);
            return bd.doubleValue();
        } else {
            return value;
        }
    }

Колко е PI ?

 

Вземи PI с по голяма точност

Виж от някой справочник колко е PI. Вземи PI с точност до максималната за типа double

Не използвай Math.PI

 

Ако и това не помогне, а ти трябва непременно синус от 180 да е 0, тогава въведи праг. Например ако се получи число по малко от еди каква си стойност, тогава се е получила нула.

В крайна сметка, да ползваме или да не ползваме Math.PI ? В Java, Math.PI е статично поле, със стойност 

3.141592653589793

което всъщност си е 15 знака точност и вече си е тип double. Освен, ако изчисленията не вземат под внимание секундите и милисекундите на градуса, тази точност му е достатъчна. В противен случай, трябва да се мисли за доста по научно-ориентирана библиотека от тази на java.lang.Math ... 

 

Въвеждането на праг е другото решение, което обаче като код и проверки не е по-малко от това със закръглянето до N-тия знак.

 

Поздрави !


В крайна сметка, да ползваме или да не ползваме Math.PI ? В Java, Math.PI е статично поле, със стойност 

3.141592653589793

което всъщност си е 15 знака точност и вече си е тип double.

 

Съжалявам, написах го от общи съображения. Не знам java и си помислих, че може би Math.PI не е с максималната за тип дабъл точност и може би това евентуално би могло да реши проблема.

 

Надявам се не съм объркал колегата.

Редактирано от Реджеп Иведик (преглед на промените)

Съжалявам, написах го от общи съображения. Не знам java и си помислих, че може би Math.PI не е с максималната за тип дабъл точност и може би това евентуално би могло да реши проблема.

 

Надявам се не съм объркал колегата.

Съмнявам се да се обърка - все пак и мнението Ви беше основно в насока "точност", което си е напълно валидно и оправдано. А вече конкретната реализация е по-скоро допълнение, отколкото насока на мислене. А и все пак:

 

Освен, ако изчисленията не вземат под внимание секундите и милисекундите на градуса, тази точност му е достатъчна.

В противен случай, трябва да се мисли за доста по научно-ориентирана библиотека от тази на java.lang.Math ... 

и е напълно възможно, ако задачата изислява твърде малки ъгли, закръглянията да изиграят лоша шега и Math.PI да се окаже твърде грубо закръглено :). Но съм по - склонен да мисля, че говорим за тривиални случаи.

 

Поздрави !

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.