33

数値を切り上げてから切り捨てる最も効率的な方法はどれですか (切り上げ後に小数点以下の桁数を削除します)?

たとえば、10 進数が 0.5 を超える場合 (つまり、0.6、0.7 など)、切り上げてから切り捨てます (ケース 1)。それ以外の場合は、切り捨てたい (ケース 2)

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)
4

12 に答える 12

44

Lua には組み込みの math.round() 関数はありませんが、次のことができます print(math.floor(a+0.5))

于 2013-08-19T12:10:40.023 に答える
21

整数以外の 10 進数での丸めに役立つトリックは、書式設定された ASCII テキストを介して値を渡し、%f書式文字列を使用して目的の丸めを指定することです。例えば

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

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

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

10 のべき乗以外の倍数に丸めるには、依然としてスケーリングが必要であり、トリッキーなエッジ ケースがすべて含まれています。表現が簡単で動作が安定しているアプローチの 1 つは、次のように書くことです。

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

の正確な条件frac(および場合によっては の符号exact) を微調整して、必要なエッジ ケースを取得します。

于 2013-08-19T20:30:36.303 に答える
18

負の数もサポートするには、次を使用します。

function round(x)
  return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5)
end
于 2014-11-06T11:04:46.070 に答える
6

任意の桁数に丸めるものを次に示します (定義されていない場合は 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
于 2016-06-13T14:51:52.157 に答える
4

丸めが悪い場合 (端を切り取る):

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

必要に応じて、これを拡張して丸めを行うことができます。

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))

予想された結果:

334255

于 2016-04-22T15:53:53.220 に答える
1

math.ceil(a-0.5)半整数を正しく処理する必要があります

于 2013-08-19T20:18:39.767 に答える