Информация об изменениях

Сообщение Re: Java пытается маскировать неточную природу double-ов от 21.02.2022 5:55

Изменено 21.02.2022 7:55 Alexander G

Re: Java пытается маскировать неточную природу double-ов
Здравствуйте, vsb, Вы писали:

vsb>А вы как думаете? Может я не прав и это норма в современных языках? Лично мне ближе подход C++, который показывает математически точное значение при заданной точности.


Современные тенданции — специально не печатать незначащие десятичные знаки, напечатать их лишь столько, чтобы при обратной конвертации из строки попасть туда же.
Подход printf неправильный, устаревший. Следует использовать std::format.

#include <format>
#include <iostream>

int main()
{
    printf("%.60f\n", 1.0/3); // 0.333333333333333314829616256247390992939472198486328125000000
    std::cout << std::format("{:60}\n", 1.0/3); // 0.3333333333333333
    printf("%.60f\n", 0.3); // 0.299999999999999988897769753748434595763683319091796875000000
    std::cout << std::format("{:60}\n", 0.3); // 0.3
}
Re: Java пытается маскировать неточную природу double-ов
Здравствуйте, vsb, Вы писали:

vsb>А вы как думаете? Может я не прав и это норма в современных языках? Лично мне ближе подход C++, который показывает математически точное значение при заданной точности.


Современные тенданции — специально не печатать незначащие десятичные знаки, напечатать их лишь столько, чтобы при обратной конвертации из строки попасть туда же.
Подход printf неправильный, устаревший. Следует использовать std::format.

#include <format>
#include <iostream>

int main()
{
    printf("%.60f\n", 1.0/3); // 0.333333333333333314829616256247390992939472198486328125000000
    std::cout << std::format("{:60}\n", 1.0/3); // 0.3333333333333333
    printf("%.60f\n", 0.3); // 0.299999999999999988897769753748434595763683319091796875000000
    std::cout << std::format("{:60}\n", 0.3); // 0.3
}


Да, кроме std::format так же себя ведёт и std::to_chars