-5

出力が「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 
4

4 に答える 4

3

ステートメント(long)0.75は 0 を返します (double を long に変換すると、double を変換するよりも小さい最大の整数値が使用されます)。だから、0 * 9223372036854775807うまくいけば、あなたはそれを持っています0。ちなみに はlongfor のエイリアスです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、最初の操作の場合)。

于 2013-04-02T22:09:31.147 に答える
0

その理由は、どちらの場合も 1 未満の値を に変換しているためlongです。これにより値が切り捨てられる0ため、乗算も0になります

Console.WriteLine((long)0.25);  // 0
Console.WriteLine((long)0.75);  // 0
于 2013-04-02T22:09:38.397 に答える
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);
于 2013-04-02T22:09:45.180 に答える
0

乗算の前ではなく、後で変換したい。試す

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

に変換する前.25long、 です0

于 2013-04-02T22:12:05.403 に答える