1

double 型の数値を int で割りたいです。文字列形式の小数点以下 2 桁の結果のみが必要です。スタック効率の観点からこれを行う最良の方法は何ですか?

double d=321321321313131233213213213213;
int i=123;

ToString(d/i); //what do I get when I do this? A double? A float?

       public String ToString(float? result) //what should I cast the result?
        {
            return @String.Format("{0:#,0.##;} divided double by int", result);
        }
4

3 に答える 3

5

ToString(d/i); //これを行うと何が得られますか? ダブル?フロート?

あなたはダブルを得るでしょう。double を int で割ると、double 値になります。

public String ToString(float? result) //結果をキャストする必要があるのは?

値に対してa が得られるdoubleので、ここでは a だけを使用したほうがよいでしょうdouble。null 許容型を取得することは決してなくfloat、結果として a を取得することは絶対にないため、使用float?はまったく不適切です。

スタック効率の観点からこれを行う最良の方法は何ですか?

もちろん、プロファイリングしてこれが実際に問題であることが判明しない限り、これは心配する価値はありません。文字列の構築は除算よりもはるかにコストがかかり、どちらもパフォーマンスの点でホットスポットにはなりません。


これを処理するクリーンな方法は、double.ToString("N2")を使用することです。つまり、次のようになります。

double result = d/i;
string resultAsString = result.ToString("N2");

完全なフォーマットされた文字列が必要な場合は、次を使用できます。

string resultAsString = string.Format("{0:N2} divided double by int", result);
于 2012-06-16T00:23:41.587 に答える
2

Ok。まず、ordoubleではなく を取得します。数学関数は、null 許容型を返すべきではありません。無限大が で表されると想定している場合は、間違っています。無限大はビットによって決定されます。double が無限大かどうかは、 で確認できます。double?float?nullDouble.IsInfinity(double)

[SecuritySafeCritical]
public static unsafe bool IsInfinity(double d)
{
    return ((*(((long*) &d)) & 0x7fffffffffffffffL) == 0x7ff0000000000000L);
}

スタック効率の観点からこれを行う最良の方法は何ですか?

Coding Horror で、マイクロ最適化の悲劇を見ることをお勧めします。


機能は。それはまったく不要です。あなたの最善の策は次のDouble.ToString(...)とおりです。

double val = d / i;
string result = val.ToString("N2");

ただし、 を使用している場合はString.Format(...)、次を使用できます。

double val = d / i;
string result = string.Format("{0:N2} divided double by int", val);
于 2012-06-16T00:23:06.260 に答える
-1

ハッキーな解決策:

小数点以下 2 桁だけが必要な場合は、double に 100 を掛けて整数に変換し、iで割ります。

結果の文字列を取得し、最後の 2 文字の前にドットを追加します。

負の値と丸めの問題のエッジ ケースを処理することを忘れないでください。

効率を本当に気にするなら、分数の除算は整数の除算に比べて遅いプロセスです。

于 2012-06-16T00:33:02.770 に答える