Проблема с Double

Тема в разделе "Lotus - Программирование", создана пользователем divankin, 11 сен 2009.

  1. divankin

    divankin Senjor developer

    Регистрация:
    13 авг 2009
    Сообщения:
    182
    Симпатии:
    0
    Как вы думаете, что будет если выполнить данный код?
    Dim rest As Double
    rest = 42430.11
    rest = rest - 10607.53
    rest = rest - 10607.53
    rest = rest - 10607.53
    rest = rest - 10607.52
    Print rest

    У меня данный код выводит в консоль не ноль, а 1,81898940354586Е-12
    Можно ли где-то подкрутить какие-нибудь настройки клиента или сервера, чтобы избежать таких остатков, а не менять код , везде где используются сравнения вычисляемых значений типа Double?

    Клиенты: 6.5.5, 7.0.2 Win32
    Сервера: 7.0.3FP1 Linux, 8.0.2FP1 Win32
     
  2. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ничего гадкого. Просто тебе возвращается приближенное к 0 значение.
    Просто надо использовать округление Round.
    Я решал такую проблему умножением и делением 1000 и отсечением возможных знаков после запятой. Мне нужна была точность до 3-го знака
    Код (Text):
    Dim rest As Double
    rest = 42430.11 * 100
    rest = rest - 10607.53 * 100
    rest = rest - 10607.53 * 100
    rest = rest - 10607.53 * 100
    rest = rest - 10607.52 * 100
    Print rest / 100
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Тоже не ноль.
    Интересная ситуация, я когда-то встречался с этим.
    Не помню как тогда решил, но наверно смотрел в сторону
    Код (Text):
    round
    .
     
  4. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    10607.53
    внести в переменную типа double
    так как в явнов виде оно конвертится почти в long
    ко всему прочему тут нужно использовать тип Currency - валюта, там меньше "инженерных приколов"
     
  5. divankin

    divankin Senjor developer

    Регистрация:
    13 авг 2009
    Сообщения:
    182
    Симпатии:
    0
    Гадкость в том, что об этой особенности нужно помнить при всех операциях с типом Double. Я как-то не ожидал, что такие проблемы могут возникнуть при сложении и вычитании.
    В боевой программе последнего вычитания не было, а вместо него было сравнение. И программа выдавала, что 10607.52 > 10607.52
     
  6. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    это азы программирования. при работе с числами с плавающей точкой:
    1. нельзя сравнивать число их с нулем
    2. нельзя проверять два таких числа на равенство.( тот же п. 1 )
    обычно, вводится константа - т.н. "машинный ноль" , и проверяется abs( floatNumber ) < epsilon.
    для большинства реальных задач 1e-6 - достаточная точность.
    Ограничение это системное и никак с лотусом не связано.
    Java:
    double a = 1.1 - 1;
    double b = 0.1;
    System.out.println( a-b );
    Результат: 8.326672684688674E-17
    Для уяснения, что данная проблема не зависит от вида операции:
    двоичное разложение десятичной дроби 0.1 - бесконечная дробь 0.0(0011), поэтому 0.1 невозможно сохранить в double без потери точности.
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    и есть тип curency
    и эта проблема не специфична домине (как указал коллега)
     
  8. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    ой! ну хоть кто-то умный вещь сказал! а то я думал, что так и будем думать, что лотус - корень всех на свете проблем...

    ну зачем обо всех? обычно нужна точность какого-то результата, а для этого достаточно одной таблетки, т.е. одной операции приведения конечного результата к нужному виду (отображения)
     
Загрузка...
Похожие Темы - Проблема Double
  1. c0de3r
    Ответов:
    5
    Просмотров:
    119
  2. DobermannTT
    Ответов:
    10
    Просмотров:
    133
  3. SoulPaladin
    Ответов:
    4
    Просмотров:
    125
  4. Artael
    Ответов:
    1
    Просмотров:
    109
  5. ENSLER
    Ответов:
    0
    Просмотров:
    102

Поделиться этой страницей