2012-06-26 2 views
2

У меня есть два значения: один от пользовательского ввода и другой от БД.Float/Float = странный результат

var userinput = form["someInput"]; 
var valuefromDB = GetValue(someNumber); 

public float? GetValue(int id){ 
return (float?) db.table.where(p=> p.id == id).select(p=> p.Value).SingleOrDefault(); 
} 

userinput имеет значение «1» как строку, а valuefromDB имеет значение 0.001 как float.

так 1/0,001 = 1000

но мой C# код дать мне 999.999939 как результат;

var final = float.Parse(userinput)/valuefromDB 

, когда у меня есть «2» в качестве значения ввода пользователя, правильный результат, 2000 ...

+3

Это следствие точности поплавка. – Candide

+6

Каждый программист должен понимать числа с плавающей запятой: http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers – mellamokb

+0

Вам нужна точность базы 10 или вам нужна база 2? –

ответ

9

Это потому, что не все десятичные числа могут быть точно представлены в двоичном коде (который the representation that float uses). Решение состоит в том, чтобы отформатировать результат до желаемого числа десятичных знаков, что приведет к округлению и отображению «правильно».

Update: Чтобы отформатировать float для отображения, посмотрите на this MSDN reference page и this page of examples.

+0

Можете ли вы дать мне простой пример C#? :) –

+0

@NovkovskiStevoBato: Обновлен ответ. – Jon

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