Преобразование double в int в C#



в нашем коде у нас есть double, который нам нужно преобразовать в int.



double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;


может кто-нибудь объяснить мне, почему i1 != i2?



результат, который я получаю это:i1 = 9 и i2 = 8.

3117   5  

5 ответов:

, потому что Convert.ToInt32 раундов:

возвращаемое значение: округляется до ближайшего 32-разрядного целого числа со знаком. Если значение находится на полпути между двумя целыми числами, возвращается четное число; то есть 4.5 преобразуется в 4, а 5.5 преобразуется в 6.

...пока актерский состав усекает:

при преобразовании значения double или float в целочисленный тип значение усеченный.

обновление: см. комментарий Jeppe Stig Nielsen ниже для дополнительных различий (которые, однако, не вступают в игру, если score - это действительное число, как и в данном случае).

литье будет игнорировать что-либо после десятичной точки, поэтому 8.6 становится 8.

Convert.ToInt32(8.6) Это безопасный способ убедиться, что ваш двойник округляется до ближайшего целого числа, в данном случае 9.

вы можете округлить свой двойник и бросить ist:

(int)Math.Round(myDouble);

ToInt32 раундов. Приведение к int просто выбрасывает нецелочисленный компонент.

в приведенном примере ваша десятичная дробь 8.6. Если бы это было 8.5 и 9.5, заявление i1 == i2 может быть и так. На самом деле это было бы верно для 8.5, и false для 9.5.

объяснение:

независимо от десятичной части, второе утверждение,int i2 = (int)score отбросит десятичную часть и просто вернет вам целочисленную часть. Довольно опасно, так как может произойти потеря данных.

теперь, для во-первых, могут произойти две вещи. Если дробная часть 5, то есть половина, решение будет принято. Мы округлим вверх или вниз? В C# класс Convert реализует округление банкира. Смотрите этой ответа для более глубокого объяснения. Проще говоря, если число четное, округлить вниз, если число нечетное, округлить вверх.

Например, рассмотрим:

        double score = 8.5;
        int i1 = Convert.ToInt32(score); // 8
        int i2 = (int)score;             // 8

        score += 1;
        i1 = Convert.ToInt32(score);     // 10
        i2 = (int)score;                 // 9

Comments

    Ничего не найдено.