当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby BigDecimal.mode用法及代码示例


本文简要介绍ruby语言中 BigDecimal.mode 的用法。

用法

mode(mode, setting = nil) → integer

返回一个整数,表示异常处理和舍入的模式设置。

这些模式控制异常处理:

  • BigDecimal::EXCEPTION_NaN。

  • BigDecimal::EXCEPTION_INFINITY。

  • BigDecimal::EXCEPTION_UNDERFLOW。

  • BigDecimal::EXCEPTION_OVERFLOW。

  • BigDecimal::EXCEPTION_ZERODIVIDE。

  • BigDecimal::EXCEPTION_ALL。

用于异常处理的 setting 的值:

  • true :将给定的 mode 设置为 true

  • false :将给定的 mode 设置为 false

  • nil :不修改模式设置。

您可以使用方法 BigDecimal.save_exception_mode 临时更改,然后自动恢复异常模式。

为清楚起见,下面的一些示例首先将所有异常模式设置为 false

此模式控制要执行舍入的方式:

  • BigDecimal::ROUND_MODE

您可以使用方法 BigDecimal.save_rounding_mode 临时更改,然后自动恢复舍入模式。

NaNs

模式 BigDecimal::EXCEPTION_NaN 控制创建 BigDecimal NaN 时的行为。

设置:

例子:

BigDecimal.mode(BigDecimal::EXCEPTION_ALL, false) # => 0
BigDecimal('NaN')                                 # => NaN
BigDecimal.mode(BigDecimal::EXCEPTION_NaN, true)  # => 2
BigDecimal('NaN') # Raises FloatDomainError

无穷大

模式 BigDecimal::EXCEPTION_INFINITY 控制创建 BigDecimal Infinity 或 -Infinity 时的行为。设置:

  • false(默认):返回 BigDecimal('Infinity')BigDecimal('-Infinity')

  • true :引发 FloatDomainError

例子:

BigDecimal.mode(BigDecimal::EXCEPTION_ALL, false)     # => 0
BigDecimal('Infinity')                                # => Infinity
BigDecimal('-Infinity')                               # => -Infinity
BigDecimal.mode(BigDecimal::EXCEPTION_INFINITY, true) # => 1
BigDecimal('Infinity')  # Raises FloatDomainError
BigDecimal('-Infinity') # Raises FloatDomainError

下溢

模式 BigDecimal::EXCEPTION_UNDERFLOW 控制发生 BigDecimal 下溢时的行为。设置:

  • false(默认):返回 BigDecimal('0')BigDecimal('-Infinity')

  • true :引发 FloatDomainError

例子:

BigDecimal.mode(BigDecimal::EXCEPTION_ALL, false)      # => 0
def flow_under
  x = BigDecimal('0.1')
  100.times { x *= x }
end
flow_under                                             # => 100
BigDecimal.mode(BigDecimal::EXCEPTION_UNDERFLOW, true) # => 4
flow_under # Raises FloatDomainError

溢出

模式 BigDecimal::EXCEPTION_OVERFLOW 控制发生 BigDecimal 溢出时的行为。设置:

  • false(默认):返回 BigDecimal('Infinity')BigDecimal('-Infinity')

  • true :引发 FloatDomainError

例子:

BigDecimal.mode(BigDecimal::EXCEPTION_ALL, false)     # => 0
def flow_over
  x = BigDecimal('10')
  100.times { x *= x }
end
flow_over                                             # => 100
BigDecimal.mode(BigDecimal::EXCEPTION_OVERFLOW, true) # => 1
flow_over # Raises FloatDomainError

零师

模式 BigDecimal::EXCEPTION_ZERODIVIDE 控制发生 zero-division 时的行为。设置:

  • false(默认):返回 BigDecimal('Infinity')BigDecimal('-Infinity')

  • true :引发 FloatDomainError

例子:

BigDecimal.mode(BigDecimal::EXCEPTION_ALL, false)       # => 0
one = BigDecimal('1')
zero = BigDecimal('0')
one / zero                                              # => Infinity
BigDecimal.mode(BigDecimal::EXCEPTION_ZERODIVIDE, true) # => 16
one / zero # Raises FloatDomainError

所有例外

模式 BigDecimal::EXCEPTION_ALL 控制上述所有内容:

BigDecimal.mode(BigDecimal::EXCEPTION_ALL, false) # => 0
BigDecimal.mode(BigDecimal::EXCEPTION_ALL, true)  # => 23

四舍五入

模式 BigDecimal::ROUND_MODE 控制进行舍入的方式;其setting 值为:

  • ROUND_UP:从零舍入。别名为 :up

  • ROUND_DOWN:向零舍入。别名为 :down:truncate

  • ROUND_HALF_UP :向最近的邻居四舍五入;如果邻居是等距的,则从零舍入。别名为 :half_up:default

  • ROUND_HALF_DOWN :向最近的邻居四舍五入;如果邻居是等距的,则向零舍入。别名为 :half_down

  • ROUND_HALF_EVEN(庄家四舍五入):向最近邻舍入;如果邻居是等距的,则向偶数邻居舍入。别名为 :half_even:banker

  • ROUND_CEILING:向正无穷大舍入。别名为 :ceiling:ceil

  • ROUND_FLOOR:向负无穷大舍入。别名为 :floor:

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 BigDecimal.mode。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。