Может кто-нибудь, пожалуйста, объясните мне, что здесь происходит: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?
спасибо за ответ (и голова вверху: мое преобразование nop). Имеет ли float.ToString() не округленное число? Не приведет ли к усечению 1000000.12? –
@StephenEmm: Когда он находится на полпути между двумя представлениями, он округляется (или от нуля - не уверен, какой), но не имеет значения для положительных чисел). –