С# двойное вычитание

Мне нужно поработать с переменными типа double и в расчетах я наткнулся на кое-что непонятное. Я знаю, что типы с плавающей запятой не точны, но у них достаточно точности для того, что мне нужно.

Сначала я умножаю значение 200 на множитель 1,1 и получаю 220,00000000000003, что ожидаемо и достаточно близко к 220. > а затем я вычитаю это из ожидаемого значения (220). Результат должен быть 0 или очень близким к 0. Вместо этого я получаю -2.8421709430404007E-14, что я не могу объяснить.

using System;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            double u = 200;
            double v = 1.1;
            double x = u * v;
            double y = 220;
            double z = y - x;

            Console.WriteLine(u + " * " + v + " = " + x);

            Console.WriteLine(y + " - " + x + " = " + z);

            Console.ReadLine();
        }
    }
}

Любые идеи?


person trist    schedule 27.10.2015    source источник
comment
-2.8421709430404007E-14 близко к нулю (т.е. переместите десятичный разряд 14 раз влево).   -  person crashmstr    schedule 27.10.2015
comment
-2.8421709430404007E-14 означает -2.84 * 10 ^ -14. очень близко. дополнительная информация о научной нотации   -  person M.kazem Akhgary    schedule 27.10.2015
comment
Пожалуйста, изучите научную нотацию.   -  person Peter Gluck    schedule 27.10.2015
comment
Другими словами, результат очень близок (но не совсем) к -0.00000000000003   -  person crashmstr    schedule 27.10.2015
comment
Это очень близко к 0.   -  person xxbbcc    schedule 27.10.2015


Ответы (2)


Это число очень близко к 0. Это научная запись; E-14 означает 10^-14. Другими словами, сдвиньте запятую на 14 знаков влево.

Существуют библиотеки, делающие работу с операциями с плавающей запятой немного более интуитивной; в противном случае вам нужно будет выяснить и проверить допустимость, чтобы увидеть, достаточно ли вы близки.

person sschimmel    schedule 27.10.2015

Вам следует изучить использование "десятичного" типа - ваш код выглядит как C#.net. Это имеет высокую точность и предназначено для работы, как вы ожидаете (для финансовых расчетов и т. д.).

Попробуйте! :-)

person Th3Minstr3l    schedule 28.10.2015