2016-08-08 4 views
8

код здесь прямо вперед, но я не понимаю, результаты:Результаты литья поплавкового умножения приводят к разным результатам, если первый поплавок сохраняется в переменной?

float percent = 0.69f; 
int firstInt = (int)(percent*100f); 

float tempFloat = percent*100f; 
int secondInt = (int)tempFloat; 

Debug.Log(firstInt + " " + secondInt); 

Почему firstInt 68, но secondInt есть 69?

+0

Хороший вопрос –

+0

https://dotnetfiddle.net/YMJExy - результат «69 69' .. – Blorgbeard

+0

Локальный компьютер, я получаю результат« 68 69 ». – jdphenix

ответ

1

Похоже, компилятор выяснил значение выражения в

percent*100f 

используя двойную математику, и оптимизированы прочь вычисления. Это недопустимо, если промежуточные результаты сохраняются в переменной float.

Поскольку .69 не имеет точного представления в поплавке или двойном, два представления «земля» с разных сторон int: double немного выше, а float немного ниже фактического значения .69.

+0

Это, кажется, правильный ответ, я уверен, что компилятор считает разумную оптимизацию для вычисления 'float' это делать это как «двойное». Когда это просто наглядно меняет выход, и нет никаких аппаратных (runtime) соображений, которые нужно сделать, поскольку это просто выравнивает значение в выходе. Вы знаете, почему это так? – starlight54

+0

Не беспокойтесь, ответ на мой вопрос в других ответах на комментарии, компилятор C# может в значительной степени использовать больше точности всякий раз, когда ему нравится, если данный параметр, как вы говорите, сохраняет его как 'float', предотвращает его делая это. – starlight54

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

  • Нет связанных вопросов^_^