Java, BigDecimal. Проблемы с подразделением

- (NSString *)stringWithFormat:(NSString *)format andArguments:(NSArray *)arguments {
    NSMutableString *result = [NSMutableString new];
    NSArray *components = format ? [format componentsSeparatedByString:@"%@"] : @[@""];
    NSUInteger argumentsCount = [arguments count];
    NSUInteger componentsCount = [components count] - 1;
    NSUInteger iterationCount = argumentsCount < componentsCount ? argumentsCount : componentsCount;
    for (NSUInteger i = 0; i < iterationCount; i++) {
        [result appendFormat:@"%@%@", components[i], arguments[i]];
    }
    [result appendString:[components lastObject]];
    return iterationCount == 0 ? [result stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] : result;
}

Проверено с форматом и аргументами:

NSString *format = @"xxx=%@, yyy=%@ last component";
NSArray *arguments = @[@"XXX", @"YYY", @"ZZZ"];

Результат: xxx = XXX, yyy = YYY последний компонент

NSString *format = @"xxx=%@, yyy=%@ last component";
NSArray *arguments = @[@"XXX", @"YYY"];

Результат: xxx = XXX, yyy = YYY последний компонент

NSString *format = @"xxx=%@, yyy=%@ last component";
NSArray *arguments = @[@"XXX"];

Результат: xxx = XXX последний компонент

NSString *format = @"xxx=%@, yyy=%@ last component";
NSArray *arguments = @[];

Результат: последний компонент

NSString *format = @"some text";
NSArray *arguments = @[@"XXX", @"YYY", @"ZZZ"];

Результат: некоторый текст

14
задан cdeszaq 21 October 2011 в 19:02
поделиться

4 ответа

Я думаю, что лучшим решением будет установить требуемый масштаб при делении: в этом случае возможно 2.

    BigDecimal hundred = new BigDecimal(100);
    BigDecimal percentage = new BigDecimal(20);
    BigDecimal value = new BigDecimal(500);
    BigDecimal percentageFactor =
                 percentage.divide(hundred,2, BigDecimal.ROUND_HALF_UP);

    value = value.multiply(percentageFactor);
    System.out.println("final value:"+ value);

конечное значение 100,00

(Умножение использует масштаб из коэффициентов ( 0 + 2), но это тоже можно указать.)

Я бы использовал HALF_UP для учета (в моем законодательстве) или EVEN (для статистики) для режима округления.

14
ответ дан 1 December 2019 в 12:53
поделиться

Масштаб нового BigDecimal ("20") равен нулю, потому что у вас нет десятичной точки. Это означает, что ваш процент.divide (100, BigDecimal.ROUND_FLOOR) даст ноль (фактически int (20/100) или 0 ).

Если вы действительно хотите работать с дробными числами, используйте new BigDecimal ("20.00") , чтобы масштаб был установлен правильно, или используйте один из других конструкторов, чтобы задать масштаб специально.

Вот результат с этого простого изменения 20 на 20.00 , в комплекте с ошибкой в ​​написании: -)

factor:0.20
final falue:100.00
Float Value:100.0
9
ответ дан 1 December 2019 в 12:53
поделиться

вы, вероятно, захотите использовать ROUND_UP в качестве режима округления

-2
ответ дан 1 December 2019 в 12:53
поделиться

float имеет только 6 цифр точности и почти никогда не является хорошим выбором, я бы посоветовал вам использовать вместо него double. (или BigDecimal в некоторых случаях может быть лучше)

0
ответ дан 1 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: