1

小数点以下の値が四捨五入されないようにする必要があります。

ここに私が使用するコードがあります:

NSNumberFormatter* nf = [[[NSNumberFormatter alloc] init] autorelease];
nf.positiveFormat = @"0.###";      
NSString* trimmedValue = [nf stringFromNumber: [NSNumber numberWithFloat:[exRateLabel doubleValue]*amount]];
trimmedValue = [trimmedValue substringToIndex:[trimmedValue length]-1];

この場合、1000 * 50.1234を掛けると 50123.3984 になりますが、 50123.4になるはずです

NSLog(@".2f",50.1234*1000);

この場合、正しい値が表示されていますが、

NSLog(@".2f",50.1234*123);

実際の値である6165.17826165.18に丸めています。

4

5 に答える 5

2

float の代わりに double を使用し、適切な丸めルールを使用するだけです。

NSNumberFormatter* nf = [[NSNumberFormatter alloc] init];
nf.positiveFormat = @"0.###";
nf.roundingMode = NSNumberFormatterRoundFloor;
NSString* trimmedValue = [nf stringFromNumber: [NSNumber numberWithDouble:50.1234*123]];
NSLog(@"trimmedValue: %@", trimmedValue);

結果は次のとおりです。

trimmedValue: 6165.178
于 2013-04-15T14:34:58.310 に答える
2

If the mathematics is required to be precise, I'd suggest using an NSDecimalNumber.

NSDecimalNumber *myNumber = [[NSDecimalNumber alloc] initWithMantissa:501234 exponent:-4 isNegative:NO]];  
NSDecimalNumber *answer = [self multiplyDecimalNumber:myNumber with:[NSDecimalNumber decimalNumberWithMantissa:1000 exponent:0 isNegative:NO];  
NSLog(@"Answer: %g", floor([answer doubleValue]));

I made a quick wrapper for the multiplication, I never wanted an exception, your needs may be different:

-(NSDecimalNumber *) multiplyDecimalNumber:(NSDecimalNumber *) lhs with:(NSDecimalNumber *) rhs {  
    NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:NSDecimalNoScale raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];  
    return [lhs decimalNumberByMultiplyingBy:rhs withBehavior:handler];  
}
于 2013-04-15T14:54:43.233 に答える
1

どちらも正しいです。

まず、タイプミスがあると思います - . がありません%

NSLog(@"%.2f", 50.1234*1000); // same as @"%.2f", 50,123.4 = @"50123.4"

小数点以下 2 桁を印刷するように要求しているにもかかわらず、数学はきれいな 1/10 を残します。

NSLog(@"%.2f",50.1234*123); // same as @"%.2f", 5,161.1782 = @"5161.18"

2 つの 10 進数を要求しており、切り上げがデフォルトの動作です。

実際に使用したいフォーマットは次のようです。

NSLog(@"%.1f", number);

または、強制的にゼロで埋められた 2 桁が必要な場合は、次を使用します。

NSLog(@"%.02", number); // first case would come out @"50123.40"

これにより、すべての末尾のゼロが強制的に出力されます

于 2013-04-15T15:11:11.277 に答える
0

おそらく「double」表現を使用しているか、数値を浮動小数点数にキャストしているか、次のような関数を使用して切り捨てに独自のポリシーを使用できます。

float roundUp (float value, int digits) {

    int mod = pow(10, digits);

    float roundedUp = value;
    if (mod != 0) {
        roundedUp = ceilf(value * mod) / mod;
    }

    return roundedUp;
}

float roundDown (float value, int digits) {

    int mod = pow(10, digits);

    float roundedDown = value;
    if (mod != 0) {
       roundedDown = floorf(value * mod) / mod;
    }

    return roundedDown;
}

float nearestf (float value, int digits) {

    int mod = pow(10, digits);

    float nearest = value;
    if (mod != 0) {
        nearest = floorf(value*mod + 0.5) / mod;
    }

    return nearest;
}

「roundUp」が必要なものであるか、より一般的な「nearestf」を試してください

于 2013-04-15T14:30:23.253 に答える