писал я как то функцию округления....
так вот она округляла доублы,
как получалось это не правильным сопсобом так:
1)рпеобразовываем в строку
2)режем целое и дробь (строки)
3)формируем строки с ужетом округления:
— целое
— дробь
— перенос.
4)все строки конвертим в доубл и складываем
та вот при сложении трех доублов результат, который также был доубл иногда сбивался например с 3.37 на 3.3699999999999.....
так вот дело оказалось в том, что у не хватает точности доублов (с конца). и правильный выход в этом случае — складывать все в децимал, т.к. у него разрядность больше, а потом, через строку, можно конвертировать в доубл.
И точно, чего это я сразу не заметил что ты доказательств то своих слов не привел. Показывай код на MSIL где мы увидим сначала приведение к инту а потом к лонгу
Под рукой студии нету. Попробуй вместо двойки взять скажем 35. Для двойки есть отдельная инструкция ldc.i4.2 похожей интсрукции ldc.i8.2 нету. Для чисел от 0 до 8 специнструкций не наблюдается, так что с 35 ему не удастся так легко отвертеться. В общем компилер наоптимизировал таки.
Хм. Всетаки на интах не интересно проверять, думаю что для 35 и 35L все равно будет один и тот же код: ldc.i4 35 с последующим conv.i8 по одной простой причине, а именно оптимизация, эти две команды элементарно в байтах будут меньше чем ldc.i8 и дело даже не будет тут ни в каких литералах.
Интересные эксперименты:
static void Main(string[] args)
{
const long x=35;
const long xl=35L;
int y=x;
int yl=xl;
Console.WriteLine((y * yl).ToString());
}
Будут ли тут лишние преобразования, можно еще попробовать с даблами, чтобы добиться явного вызова ToIn32 из литералов.
В общем нет никакого смысла ЯВНО указывать L после цифири, мозгов компилятору и своих хватает.
Хм. а интересно что он там накомпилирует на int x=100000L и int x=100000 будет хоть что-то отличаться?
Видно, что байты хранятся в 4 байтовых ячейках. Но это нормально в 32-х разрядных системах.
-------------------------------------------------
2 ZeeM: 0x25 — это 37 в человеческой системе измерения. Поэтому (может, кто-то уже предлагал) надо делать правильное форматирование (http://msdn2.microsoft.com/en-us/library/dwhawy9k.aspx):
byte a = 0x25;
byte b = 0x00;
string temp = a.ToString("x") + b.ToString("x");
БУДЕТ КАК РАЗ ТО, ЧТО НУЖНО!
-------------------------------------------------
2 RuneLord:
С какой стати я должен ему доверять?
Microsoft редко делает что-то хорошее.
Как Ты делал человеческое форматирование кода в своём сообщении (цвета там, отступы)?