2

float 値を小数点以下 3 桁まで下げようとしています。たとえば、値 2.56976 は 2.570 ではなく 2.569 になります。私は次のような答えを検索して見つけました:

小数点以下2倍のフロア

そのような答えは正確ではありません。たとえば、コード:

double value = (double)((unsigned int)(value * (double)placed)) / (double)placed

を返すことができますがvalue - 1、これは正しくありません。value と place を乗算すると、value * (double)placed)2100.999999996 のようになります。unsigned int に変更すると、間違った 2100 になります (正しい値は 2101 のはずです)。他の回答にも同じ問題があります。Java では、BigDecimalすべてのハッセルを保存する which を使用できます。

(注: もちろん、2100.9999 を四捨五入することはオプションではありません。これは、「小数点以下 3 桁を正しく」というフローリングのアイデア全体を台無しにするためです)

4

3 に答える 3

0

たとえば、値 2.56976 は 2.570 ではなく 2.569 になります。

解決策は次のように簡単です:

double result = floor(2.56976 * 1000.0) / 1000.0;

複雑さを検索する理由がわかりません...これは完全に機能し、何かを通過する必要はありませunsigned int+ 0.0001

重要な注意点 :

NSLog(@"%.4f", myDouble);

実際に変数に対してラウンドを実行します。だから、あなたがフロアに立つことができると信じるのは不適切です.%.Xf

于 2015-02-25T08:28:27.937 に答える
0

NSString を含むソリューションを検討する必要がありましたが、それは魅力的に機能しました。完全な方法は次のとおりです。

- (float) getFlooredPrice:(float) passedPrice {

    NSString *floatPassedPriceString = [NSString stringWithFormat:@"%f", passedPrice];
    NSArray *floatArray = [floatPassedPriceString componentsSeparatedByString:@"."];
    NSString *fixedPart = [floatArray objectAtIndex:0];
    NSString *decimalPart = @"";
    if ([floatArray count] > 1) {
        NSString *decimalPartWhole = [floatArray objectAtIndex:1];
        if (decimalPartWhole.length > 3) {
            decimalPart = [decimalPartWhole substringToIndex:3];
        } else {
            decimalPart = decimalPartWhole;
        }
    }
    NSString *wholeNumber = [NSString stringWithFormat:@"%@.%@", fixedPart, decimalPart];

    return [wholeNumber floatValue];

}
于 2013-06-18T07:12:53.363 に答える
0

次のコードが機能するはずです。

#include <stdio.h>
#include <math.h>
int main(void) {
    double value = 1.23456;
    double val3;
    val3 = floor(1000.0 * value + 0.0001) * 0.001; // add 0.0001 to "fix" binary representation problem
    printf("val3 is %.8f; the error is %f\n", val3, 1.234 - val3);
}

これが出力されます

val3 is 1.23400000; the error is 0.000000

残留エラーがある場合、浮動小数点数は必ずしも正確に表現できるとは限らないという事実から発生します。BigDecimal などの背後にある考え方は、非常に明示的な方法でそれを回避することです (たとえば、数値をバイナリ表現ではなく数字 - 効率は劣りますが、精度は維持されます)

于 2013-06-18T02:29:16.410 に答える