5

Может кто-нибудь, пожалуйста, объясните мне, что здесь происходит:C# Поплавок точность

using System; 
using System.Text; 

namespace ConsoleApplication1 { 

    class Program { 

     static void Main(string[] args) { 

      object o = 1000000.123f; 
      float f= Convert.ToSingle(o); 
      double d = Convert.ToDouble(f); 

      Console.WriteLine(f.ToString("r")); 
      Console.WriteLine(d.ToString("r")); 

      Console.ReadLine(); 

     } 
    } 
} 

Какие выходы:

1000000,13

1000000,125

я ожидал:

Объект о иметь базовый тип float (похоже, [наблюдая за часами w indow, где оно введено в качестве объекта {поплавка})

Это 1000000.123f бы откладываются в е, как 1000000.125 (приближение IEEE754 в 32 бит?)

Это двойной будет хранить 1000000.125, а также (кажется, случается даже если f, похоже, не содержит того, что я ожидал)

Чтобы запросить формат туда и обратно, ToString вернет мне 1000000.125 в обоих случаях.

Может ли кто-нибудь сказать мне, что я делаю неправильно, чтобы получить 1000000.13 при выводе f?

ответ

5

Как вы уже заметили, число 1000000.123 хранится как 1000000.125. Это отображается как -то на double.ToString(), но усекается float.ToString(), потому что слишком много цифр вводит в заблуждение.

Кстати, нет Convert.ToSingle(float), потому что он просто вернет именно то, что вы прошли. Ваш код на самом деле разрешает Convert.ToSingle(double). Таким образом, вы (неявно) конвертируете в double, а затем (явно) обратно в float, что по существу не является операционным.

Внимание! Не доверяйте калькуляторам с плавающей запятой JavaScript. Некоторые из них утверждают, что 1000000.123 хранится как 1000000.1 одноточечными поплавками, что, как я полагаю, основано на предположении, что, поскольку поплавки IEEE имеют примерно 7,22 цифры точности, их можно точно представить в 8 цифр. Это неверно.

+0

спасибо за ответ (и голова вверху: мое преобразование nop). Имеет ли float.ToString() не округленное число? Не приведет ли к усечению 1000000.12? –

+0

@StephenEmm: Когда он находится на полпути между двумя представлениями, он округляется (или от нуля - не уверен, какой), но не имеет значения для положительных чисел). –

Смежные вопросы