Почему происходит сбой Convert.ToInt32 ("10.0") - PullRequest
2 голосов
/ 22 декабря 2010

Не только в .NET, но такое преобразование завершается ошибкой даже в SQL Server 2005 ...

Может кто-нибудь сказать мне, почему?

Не было бы разумно возвращать только целую часть, даже если

    Convert.ToInt32("10.2")

Ответы [ 4 ]

5 голосов
/ 22 декабря 2010

Лучше потерпеть неудачу, чем вернуть неожиданный результат.10.0 и 10.2 не являются целыми числами.Если вы знаете, что вы будете иметь дело с числами с плавающей запятой, используйте соответствующий тип данных:

float result = Convert.ToSingle("10.2", CultureInfo.InvariantCulture);

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

5 голосов
/ 22 декабря 2010

Другие объяснили, почему парсинг "10.2" как 10 был бы плохой идеей. Теперь давайте рассмотрим «10.0».

«10.0» - это строковое представление числа, которое может иметь дробную часть - другими словами, не целое число.

Если вы анализируете значение как целое число, вы должны анализировать целочисленное представление. «10.0» почти наверняка всего лишь по совпадению целое число ... источник данных, очевидно, не является источником целых чисел, поэтому не следует рассматривать их как целые числа.

Если вы хотите, чтобы ближайшее целое число было «действительным» числом, вы должны разобрать его как действительное число, а затем округлить, как хотите.

Думайте об этом так: выбор правильной формы синтаксического анализа выражает веру в формат ввода. Текущее поведение говорит вам, что вы плохо угадываете.

2 голосов
/ 22 декабря 2010

Convert.ToInt32 ("10.0") - это просто вызов Int32.Parse ("10.0"), который, в свою очередь, равен Number.ParseInt32 ("10.0", NumberStyles.Integer, NumberFormatInfo.GetInstance (поставщик));

Самая интересная часть здесь - это значение NumberStyles.Integer.Это составной стиль нумерации, включающий стили AllowLeadingWhite, AllowTrailingWhite и AllowLeadingSign.Имейте ввиду, что AllowDecimalPoint не включен в значение NumberStyles.Integer.Итак, если строка содержит десятичную точку, у нас есть исключение формата.Поскольку десятичная точка не разрешена для анализа Int32.

2 голосов
/ 22 декабря 2010

Поскольку 10.2 не является целым числом, и было бы лучше, если бы программист явно указывал о потере точности.

Если это сработает, а не сгенерирует, есть большая вероятность непреднамеренной потери точностипроизойдут ошибки из-за неправильных назначений / преобразований типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...