Перейти к содержимому
Топаз6.0 · До релиза
Загрузка →

Поиск в документации

Спецификация 6.0

Выберите результат стрелками и нажмите Enter, чтобы открыть его.

Введите имя API, номер диагностики, правило или тему проекта.

    Библиотека · std.decimal

    Decimal.round

    Round to a requested decimal grid with HalfEven as the default mode.

    round(scale: int, mode: RoundingMode = RoundingMode.HalfEven()) -> Decimal
    Модуль
    std.decimal →
    Получатель
    Decimal
    Минимальное число аргументов
    1
    Максимальное число аргументов
    2

    Declaration and parameters

    Ссылка

    Доступность

    Включено по умолчанию · Не определено

    Import std.decimal in language mode 5.21.

    The current compiler selects std/decimal.tpz for this language mode. Availability in other released editions and inclusion in each installed distribution are Pending.

    Получатель

    Decimal

    Ограничения параметров

    For a requested scale s, rounding selects a multiple of ten raised to negative s. A value already on that grid is unchanged in every rounding mode.

    The requested scale must be an int from 0 through 4294967295 inclusive. A negative value or a value above that range raises TPZ5001 during execution. Scale is never clamped or interpreted as digits to the left of the decimal point.

    When the requested scale is at least the canonical scale, round returns the same value. Otherwise it chooses a grid value according to the supplied mode and normalizes the result.

    RoundingMode.Down() chooses the greatest grid value no greater than the input. It rounds toward negative infinity, including at a midpoint.

    RoundingMode.Up() chooses the least grid value no smaller than the input. It rounds toward positive infinity, including at a midpoint.

    RoundingMode.TowardZero() chooses the grid value with smaller absolute magnitude when the input is between two grid values. RoundingMode.AwayFromZero() chooses the one with larger absolute magnitude. These directions also apply at midpoints.

    RoundingMode.HalfUp() chooses the nearer grid value. At an exact midpoint it chooses the value with greater absolute magnitude for either sign.

    RoundingMode.HalfEven() chooses the nearer grid value. At an exact midpoint it chooses the value whose integer coefficient on the requested grid is even. Determine parity before canonical trailing zeros are removed.

    Omitting the mode selects RoundingMode.HalfEven(). The default is independent of host settings and applies equally to positive and negative values.

    A carry may reduce the canonical scale. A rounded zero has scale zero and no negative sign. Rounding does not pad the result to the requested scale.

    Each RoundingMode spelling constructs a distinct zero payload enum variant and uses parentheses. The modes are immutable values that callers may store and pass to both round and div.

    Результат

    The declared result type is Decimal.

    Эффекты

    Ошибки

    Result and effects

    Ссылка

    Use a scale from 0 through 4294967295 and one of the six rounding modes. Normalize the result without adding display zeros. An invalid scale raises TPZ5001 during execution.

    The caller selects precision and rounding intent explicitly without a hidden global context.

    Resolved contracts

    Ссылка

    Related entries

    Ссылка

    std.decimal →

    Choose a decimal grid and a rounding direction

    Ссылка
    Правилоtopaz.stdlib.contract.decimal-round.rule

    Choose a decimal grid and a rounding direction

    For a requested scale s, rounding selects a multiple of ten raised to negative s. A value already on that grid is unchanged in every rounding mode.

    The requested scale must be an int from 0 through 4294967295 inclusive. A negative value or a value above that range raises TPZ5001 during execution. Scale is never clamped or interpreted as digits to the left of the decimal point.

    When the requested scale is at least the canonical scale, round returns the same value. Otherwise it chooses a grid value according to the supplied mode and normalizes the result.

    RoundingMode.Down() chooses the greatest grid value no greater than the input. It rounds toward negative infinity, including at a midpoint.

    RoundingMode.Up() chooses the least grid value no smaller than the input. It rounds toward positive infinity, including at a midpoint.

    RoundingMode.TowardZero() chooses the grid value with smaller absolute magnitude when the input is between two grid values. RoundingMode.AwayFromZero() chooses the one with larger absolute magnitude. These directions also apply at midpoints.

    RoundingMode.HalfUp() chooses the nearer grid value. At an exact midpoint it chooses the value with greater absolute magnitude for either sign.

    RoundingMode.HalfEven() chooses the nearer grid value. At an exact midpoint it chooses the value whose integer coefficient on the requested grid is even. Determine parity before canonical trailing zeros are removed.

    Omitting the mode selects RoundingMode.HalfEven(). The default is independent of host settings and applies equally to positive and negative values.

    A carry may reduce the canonical scale. A rounded zero has scale zero and no negative sign. Rounding does not pad the result to the requested scale.

    Each RoundingMode spelling constructs a distinct zero payload enum variant and uses parentheses. The modes are immutable values that callers may store and pass to both round and div.

    Причина

    A decimal grid states which precision the caller needs. Nearest rounding, an upper or lower bound, and movement toward or away from zero express different numeric intentions. Their results can agree for some inputs without making their meanings interchangeable. HalfEven gives exact ties a stable rule without consistently favoring one magnitude direction.

    Resolve positive and negative ties in every rounding mode

    Ссылка
    main.tpzResolve positive and negative ties in every rounding modeОткрыть песочницу →
    1. import std.decimal { Decimal, RoundingMode }
    2. import std.test
    3. import std.io
    4. function read(text: string) -> Decimal {
    5. let parsed: Option<Decimal> = Decimal.parse(text)
    6. let value: Decimal = test.assertSome(parsed)
    7. return value
    8. }
    9. function rounded(text: string, mode: RoundingMode) -> string {
    10. let value: Decimal = read(text)
    11. return value.round(0, mode).toString()
    12. }
    13. let modes: Array<RoundingMode> = [RoundingMode.Down(), RoundingMode.Up(), RoundingMode.TowardZero(), RoundingMode.AwayFromZero(), RoundingMode.HalfUp(), RoundingMode.HalfEven()]
    14. for mode in (modes) {
    15. let a = rounded("2.5", mode)
    16. let b = rounded("3.5", mode)
    17. let c = rounded("-2.5", mode)
    18. let d = rounded("-3.5", mode)
    19. io.writeLine("{a} {b} {c} {d}")
    20. }
    Ожидаемый выводКод завершения 0
    2 3 -3 -4
    3 4 -2 -3
    2 3 -2 -3
    3 4 -3 -4
    3 4 -3 -4
    2 4 -2 -4
    
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 2 3 -3 -4
    2. 3 4 -2 -3
    3. 2 3 -2 -3
    4. 3 4 -3 -4
    5. 3 4 -3 -4
    6. 2 4 -2 -4

    Distinguish directed rounding from nearest rounding

    Ссылка
    main.tpzDistinguish directed rounding from nearest roundingОткрыть песочницу →
    1. import std.decimal { Decimal, RoundingMode }
    2. import std.test
    3. import std.io
    4. function read(text: string) -> Decimal {
    5. let parsed: Option<Decimal> = Decimal.parse(text)
    6. let value: Decimal = test.assertSome(parsed)
    7. return value
    8. }
    9. function rounded(text: string, mode: RoundingMode) -> string {
    10. let value: Decimal = read(text)
    11. return value.round(0, mode).toString()
    12. }
    13. let modes: Array<RoundingMode> = [RoundingMode.Down(), RoundingMode.Up(), RoundingMode.TowardZero(), RoundingMode.AwayFromZero(), RoundingMode.HalfUp(), RoundingMode.HalfEven()]
    14. for mode in (modes) {
    15. let a = rounded("2.1", mode)
    16. let b = rounded("2.9", mode)
    17. let c = rounded("-2.1", mode)
    18. let d = rounded("-2.9", mode)
    19. io.writeLine("{a} {b} {c} {d}")
    20. }
    Ожидаемый выводКод завершения 0
    2 2 -3 -3
    3 3 -2 -2
    2 2 -2 -2
    3 3 -3 -3
    2 3 -2 -3
    2 3 -2 -3
    
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 2 2 -3 -3
    2. 3 3 -2 -2
    3. 2 2 -2 -2
    4. 3 3 -3 -3
    5. 2 3 -2 -3
    6. 2 3 -2 -3

    Apply the default mode and normalize a carry or zero

    Ссылка
    main.tpzApply the default mode and normalize a carry or zeroОткрыть песочницу →
    1. import std.decimal { Decimal }
    2. import std.test
    3. import std.io
    4. function read(text: string) -> Decimal {
    5. let parsed: Option<Decimal> = Decimal.parse(text)
    6. let value: Decimal = test.assertSome(parsed)
    7. return value
    8. }
    9. let value: Decimal = read("1.245")
    10. io.writeLine(value.round(2).toString())
    11. io.writeLine(read("1.255").round(2).toString())
    12. io.writeLine(value.round(5).toString())
    13. let carry: Decimal = read("9.995").round(2)
    14. let zero: Decimal = read("-0.004").round(2)
    15. io.writeLine("{carry.toString()} {carry.scale()}")
    16. io.writeLine("{zero.toString()} {zero.scale()}")
    17. io.writeLine(value.toString())
    Ожидаемый выводКод завершения 0
    1.24
    1.26
    1.245
    10 0
    0 0
    1.245
    
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 1.24
    2. 1.26
    3. 1.245
    4. 10 0
    5. 0 0
    6. 1.245

    Accept the largest scale without adding stored zeros

    Ссылка
    main.tpzAccept the largest scale without adding stored zerosОткрыть песочницу →
    1. import std.decimal { Decimal }
    2. import std.test
    3. import std.io
    4. let one: Decimal = (1).toDecimal()
    5. let zero: Decimal = (0).toDecimal()
    6. let same: Decimal = one.round(4294967295)
    7. let sameZero: Decimal = zero.round(4294967295)
    8. io.writeLine("{same.toString()} {same.scale()}")
    9. io.writeLine("{sameZero.toString()} {sameZero.scale()}")
    Ожидаемый выводКод завершения 0
    1 0
    0 0
    
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 1 0
    2. 0 0

    Reject a rounding scale outside the valid range

    Ссылка
    main.tpzReject a rounding scale outside the valid rangeОткрыть песочницу →
    1. import std.decimal { Decimal }
    2. import std.io
    3. let value: Decimal = (1).toDecimal()
    4. value.round(-1)
    5. io.writeLine("after")
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения run. Ненулевой код завершения.

    Reject a rounding scale outside the valid range

    Ссылка
    main.tpzReject a rounding scale outside the valid rangeОткрыть песочницу →
    1. import std.decimal { Decimal }
    2. import std.io
    3. let value: Decimal = (1).toDecimal()
    4. value.round(4294967296)
    5. io.writeLine("after")
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения run. Ненулевой код завершения.

    Diagnostics

    Ссылка

    Runtime value guard →

    Меню

    Загрузка →