出力が「0 and 0」なのはなぜですか? どうすれば修正できますか?
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
出力が「0 and 0」なのはなぜですか? どうすれば修正できますか?
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
ステートメント(long)0.75
は 0 を返します (double を long に変換すると、double を変換するよりも小さい最大の整数値が使用されます)。だから、0 * 9223372036854775807
うまくいけば、あなたはそれを持っています0
。ちなみに はlong
for のエイリアスです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
リテラルを気にしないでください"{0:N}"
。出力に視覚的な美しさを与えるための単なる形式です。デフォルトでは double は科学表記法で出力されますが、これはあまり実証できません (たとえば2.30584300921369E+18
、最初の操作の場合)。
その理由は、どちらの場合も 1 未満の値を に変換しているためlong
です。これにより値が切り捨てられる0
ため、乗算も0になります
Console.WriteLine((long)0.25); // 0
Console.WriteLine((long)0.75); // 0
長くキャストされた 0.25 と 0.75 は 0 であるためです。
これを改善するには、float または double を使用する必要があります。ただし、精度が正確な結果につながるのに十分であると 100% 確信しているわけではありません。
Int64 small= (Int64)(0.25 * (double)Int64.MaxValue);
Int64 large = (Int64)(0.75 * (double)Int64.MaxValue);
乗算の前ではなく、後で変換したい。試す
Int64 small= (long) (0.25 * (double) Int64.MaxValue);
に変換する前.25
はlong
、 です0
。