2013-08-19 14 views
12

数値を切り上げて切り捨てる(小数点以下を切り捨てる)のに最も効率的な方法はどれですか?ルア:丸めて数字を切り捨てる

たとえば、小数点が0.5(つまり0.6,0.7など)を超える場合は、切り上げて切り捨て(ケース1)します。 print(math.floor(a+0.5)):そうでなければ、私は

for example: 
232.98266601563 => after rounding and truncate = 233 (case 1) 
232.49445450000 => after rounding and truncate = 232 (case 2) 
232.50000000000 => after rounding and truncate = 232 (case 2) 

答えて

15

はLuaのにはビルドイン恐らくMath.round()関数ではありませんが、あなたは次の操作を行うことができます(ケース2)切り捨てしたいと思います。

3

は全体の整数以外の桁に丸めるために有用であるトリックがフォーマットされたASCIIテキストから値を渡すと、指定し%fフォーマット文字列を使用することで、正しく半整数値を処理するためのmath.ceil(a-0.5)

+1

"正しく"は何を意味するかによって異なります。半分のステップについて何をすべきか、そして負の値をどうするかを慎重に決める必要があります。どちらも半分と「床」を加算し、半分を減算し、「ceil」は正確な半分の場合に一貫したバイアスを導入します。そして、両方とも、半分を加え、切り捨てが通常ゼロに向かって丸められると仮定して切り捨てることとは異なります。より均等な値へのラウンドを実装することは、ある意味では「公正」です。丸みは繊細さに満ちている。 – RBerteig

10

であるべき必要な丸め。例えば

mils = tonumber(string.format("%.3f", exact)) 

は0.001の倍数にexactで任意の値を丸めます。

math.floor()またはmath.ceil()のいずれかを使用する前後のスケーリングでも同様の結果が得られますが、エッジケースの処理に関する期待に応じて詳細を正しく取得するのは難しい場合があります。これはstring.format()の問題ではありませんが、多くの作業が「期待される」結果を出すようになっています。

10の累乗以外の倍数に丸めするには、引き続きスケーリングが必要ですが、依然としてすべてのトリッキーなエッジケースがあります。表現が簡単で、安定した動作を持つ一つのアプローチは、

function round(exact, quantum) 
    local quant,frac = math.modf(exact/quantum) 
    return quantum * (quant + (frac > 0.5 and 1 or 0)) 
end 

を書いて、あなたが望んでいたエッジケースを取得するためにfracexactのと、おそらく記号)上の正確な状態を微調整することです。

6

も、この使用、負の数をサポートするために:あなたがしたい場合、あなたは良いの丸めのためにこれを拡張することができ、まあ

function round(number) 
     return number - (number % 1) 
    end 

:悪い丸め

function round(x) 
    return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5) 
end 
0

(エンドを切断します) 。

function round(number) 
     if (number - (number % 0.1)) - (number - (number % 1)) < 0.5 then 
     number = number - (number % 1) 
     else 
     number = (number - (number % 1)) + 1 
     end 
    return number 
    end 

print(round(3.1)) 
print(round(math.pi)) 
print(round(42)) 
print(round(4.5)) 
print(round(4.6)) 

期待される結果:私のために働いた

3、3、42、5、5

:D

2

は、ここ桁の任意の数に丸める1(0の場合です定義されていない):

function round(x, n) 
    n = math.pow(10, n or 0) 
    x = x * n 
    if x >= 0 then x = math.floor(x + 0.5) else x = math.ceil(x - 0.5) end 
    return x/n 
end 
関連する問題