質問
私は簡単にC#機能:
public static double Floor(double value, double step)
{
return Math.Floor(value / step) * step;
}
を計算する数値の高い方がより低い、または等しい"価値"は、複数のステップ.が欠けてい精度、との見解を試験:
[TestMethod()]
public void FloorTest()
{
int decimals = 6;
double value = 5F;
double step = 2F;
double expected = 4F;
double actual = Class.Floor(value, step);
Assert.AreEqual(expected, actual);
value = -11.5F;
step = 1.1F;
expected = -12.1F;
actual = Class.Floor(value, step);
Assert.AreEqual(Math.Round(expected, decimals),Math.Round(actual, decimals));
Assert.AreEqual(expected, actual);
}
第主張は、第に失敗したので、結果は同等までに6回ます。この理由は何でしょうか?、本当にありがとう修正。
更新 だデバッグを試験いたように、これまでとは違った値が等しいまでの8位までの6かMath.丸の中からいくつかをご紹介しますimprecision.
注意 私の試験のコードを書いたの"F"の接尾辞明したfloatを一定の立場に立っても"D"(ダブル)なので、変えることができるようになった。
解決
省略した場合は、すべてのF postfixes(ie -12.1
の代わりに -12.1F
)までの平等を数桁の数字です。御定数(特にその予想値は浮かぶので F
.行っているのだとかその目的を説明してください。
でも、私も彼の意見に賛成の応答との比較ダブルまたはfloat型の値に等をかけて食べるという習慣がありません。
他のヒント
んよういんが、とにかく実施==演算子のための浮子、表示されます。でも、間違ったいない場合はダブルまたはフロートと同等その他の値です。
浮動小数点演算コンピュータは正確な科学).
したい場合に正確な精度を所定の小数点以下の桁数小数点に使用ではなくダブルまたは受け入れで未成年の間隔で出ています。
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
例えば、非representability0.1 0.01(バイナリ)によるスクエア0.1は0.01ものrepresentable数に最も近いです。
利用浮動小数点したい場合は、機械の解釈(バイナリ)の数。できないのは10セント.
したい場合は、精度利用システム。類ではありません。したい場合は速度利用システム。ダブル(またはシステム。ができます。浮動小数点の数の"無限精度数値、およびその主張の平等を含む必要があります。どちらに数理番号の桁こにあります。
- 都内に何件か店を構えるい数学の非常に大きく非常に少なfloatまたはdouble.
- が必要な場合は無限精度なfloatまたはdouble.
- の場合は集計では非常に大きな数値を使用しないfloatまたはdoubleの誤差のある化合物ます。
- が必要な場合は速やサイズ、floatまたはdouble.
見 この 回答(もん)のための詳細な解析の精度に影響を与え結果の処理が必要とされていました。
チェックの回答: ても安全でしょうかをチェック浮動小数点の値が等0?
んでいただくことで、オンライン予約"の内容の---"
floatおよびdoubleを正確にしています。この制限は、IEEE浮動小数点システム。するために忠実な精度を使用する必要があり、より高度な数学の図書館があります。
必要がなければ精度の過去、その後も小数点が良いと思われます。高精度なります。
同様な問題については、私は最後に、以下の実施という成功の私のテストケース(最大5桁の精度):
public static double roundValue(double rawValue, double valueTick)
{
if (valueTick <= 0.0) return 0.0;
Decimal val = new Decimal(rawValue);
Decimal step = new Decimal(valueTick);
Decimal modulo = Decimal.Round(Decimal.Divide(val,step));
return Decimal.ToDouble(Decimal.Multiply(modulo, step));
}