Сокращение числа ToString () в .NET - PullRequest
0 голосов
/ 13 января 2011

Итак, WPF вызывает ToString () для объектов при генерации TextColumns в DataGrid, а затем я обнаружил странную вещь о методе ToString (): Проверьте это:

object a = 0.3780000001;//Something like this
Console.WriteLine(a.ToString());//Gets truncated in some cases

Сначала я подумал, что это простоокругление, но несколько раз мне удавалось воспроизвести такое поведение на удвоениях с <15 цифрами после точки.Я что-то упустил? </p>

Ответы [ 9 ]

9 голосов
/ 13 января 2011

Для компьютера 0.378 и 0.378000 ... 0001 - это одно и то же число. Смотрите этот вопрос: Почему арифметика с плавающей запятой в C # неточна?

4 голосов
/ 13 января 2011

Как определено на странице MSDN для System.Double , тип double содержит максимум пятнадцать цифр точности. Несмотря на то, что он содержит 17 внутри, ваша цифра содержит 18 значащих цифр; это вне диапазона System.Double.

4 голосов
/ 13 января 2011

Используйте decimal вместо float для более точного типа.

3 голосов
/ 26 января 2012

По умолчанию Double.ToString() усекает до 15 цифр после точки, но если вы действительно хотите использовать тип данных double и вам нужны эти 2 дополнительные цифры, вы можете использовать строку форматирования "G17":

double x = 3.1415926535897932;

string pi = x.ToString("G17");

Это даст вам строку с полными 17 цифрами.

2 голосов
/ 13 января 2011

Я бы не предположил (так быстро), что вы нашли ошибку в чем-то столь важном, как реализация ToString в C #.

Поведение, которое вы испытываете, вызвано тем, что поплавок неточно хранится в памяти компьютера (см. Также этот вопрос ).

1 голос
/ 13 января 2011

Установите a как десятичное число, и оно будет печататься правильно!

decimal a = 0.378000000000000001m;
    Console.WriteLine(a.ToString()); 
1 голос
/ 13 января 2011

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

http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

1 голос
/ 13 января 2011

может быть, диапазон точности числового формата не содержит это число?(то есть, float имеет точность только до нескольких значащих цифр)

0 голосов
/ 13 января 2011

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

например


 object a = 0.378000000000000001;
 Console.WriteLine(a.ToString(Settings.DecimalFormat));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...