Если/else, если всегда идет в оператор else

Я пытаюсь сделать функцию, которая определяет комиссию на основе введенной пользователем суммы. Он вводит двойное имя пользователя и использует его для определения того, какое уравнение он использует. Но код, который я написал, всегда идет в оператор else, и я не уверен, что не так с моими условиями.

double calculate(double s)
{
    double c;
    if (s > 300,000)
    {
        c = 25,000 + (0.15 * (s-300,000));
        cout << "went to if" << endl;
        return c;

    }

    else if (300,000 > s && s > 100,000)
    {
        c = 5,000 + (0.10 * (s-100,000));
        cout << "went to else if" << endl;
        return c;

    }

    else
    {
        c = 0.05 * s;
        cout << "went to else" << endl;
        return c;

    }
} 

Ответы

Ответ 1

s > 300,000 - выражение запятая, эквивалентное (s > 300),000. Значение выражения для запятой - это значение последнего в списке, здесь 000. Которая оценивается как false при преобразовании в bool.

Вы можете написать это как

if( s > 300'000 )

или, если компилятор не поддерживает эту новомодную нотацию, как только

if( s > 300000 )

Или вы можете определить

double const k = 1000;

и напишите

if( s > 300*k )

И аналогично для 25 000, 100 000 и 5000 литералов.

Ответ 2

Что было предназначено как число 300,000 в

if (s > 300,000)

по сути, любопытное использование , -оператора, которое анализируется как

if ((s > 300),(000))

и приводит к false все время. Вместо этого попробуйте

if (s > 300000)

(То же самое для else if (300,000 > s && s > 100,000) и в нескольких других местах.)

Ответ 3

300,000 не является правильным литералом double, но применяет оператор запятой и заканчивается значением 0.

Используйте . для двойных литералов: 300.000 или разделитель для тысяч: 300000