2013-04-02 3 views
-5

Почему выходные данные «0 и 0»? Как это исправить?Int64 арифметическая ошибка

Int64 small= (long)0.25 * (long)Int64.MaxValue; 
Int64 large = (long)0.75 * (long)Int64.MaxValue; 
System.Console.WriteLine(small + " and " + large); 
System.Console.ReadLine(); 
//output 
//0 and 0 
+4

-1 для мало усилий. Это очень легко решить, попробовав –

+0

Что вы ожидаете от этого (долго) 0,25', чтобы вернуться? –

ответ

3

Заявление (long)0.75 возвратит 0 (преобразование двойной долго будет принимать наибольшее целое значение, то есть ниже, чем преобразование двойной). Итак, у вас есть 0 * 9223372036854775807, который, мы надеемся, 0. Кстати long является псевдонимом для Int64, что означает, что они являются же основными типами, поэтому, (long)Int64.MaxValue вы литье long к long

, чтобы исправить это просто использовать double * long умножения

long small= (long)(0.25 * long.MaxValue); 
long large = (long)(0.75 * long.MaxValue); 

Console.WriteLine ("{0:N}", small); //print 2,305,843,009,213,693,952.00 
Console.WriteLine ("{0:N}", large); //print 6,917,529,027,641,081,856.00 

Дон» t беспокоиться с "{0:N}" буквально, это просто формат, который дает результат некоторой визуальной красоте. По умолчанию double печатается в научной нотации, что не является столь очевидным (например, 2.30584300921369E+18 для первой операции)

+0

Вау, я чувствую себя очень глупым. – sammarcow

0

Причина в том, что в обоих случаях вы преобразовываете значение, которое меньше 1 на long. Это усечение значения 0 поэтому умножение также приводит к 0

Console.WriteLine((long)0.25); // 0 
Console.WriteLine((long)0.75); // 0 
0

Поскольку 0,25 и 0,75 литых, как долго 0.

Для того чтобы исправить это, вам нужно будет использовать поплавки или двойники. Тем не менее, я не 100% уверен, точность достаточно, чтобы привести к точным результатам:

Int64 small= (Int64)(0.25 * (double)Int64.MaxValue); 
Int64 large = (Int64)(0.75 * (double)Int64.MaxValue); 
0

Вы хотите конвертировать после не до умножения. Попробуйте

Int64 small= (long) (0.25 * (double) Int64.MaxValue); 

Перед превращали .25 в long, который 0.

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

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