當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。