16

エポックからのマイクロ秒数を示す Lua のタイムスタンプを扱っています (例: "1247687475123456")。

私は本当にその数字をそのひどい栄光のすべてで印刷できるようにしたいと思っていますが、ルアはそれを科学表記法で印刷することを主張しています. フォーマットされた文字列の印刷に関する入手可能なドキュメントを精査しましたが、使用可能なコマンドは「科学表記法で印刷する (%e/%E)」と「数値が非常に長い場合は科学表記法で自動的に印刷する (%g)」だけです。 . 数値を通常の形式で出力するためのオプションはないようです。

元の数値を取得し、10 で割って数字をループで出力する関数を作成できることはわかっていますが、それは洗練されていない面倒のように思えます。確かに、言​​語に組み込まれているこれを行う方法はありますか?

4

2 に答える 2

22
> print(string.format("%18.0f",1247687475123456))

1247687475123456

于 2009-07-15T20:19:25.987 に答える
8

Lua は通常構成されているため、プラットフォームの通常の倍精度浮動小数点形式を使用してすべての数値を格納します。今日のほとんどのデスクトップ プラットフォームでは、64 ビットの IEEE-754 形式になります。従来の知恵では、-1E15 から +1E15 の範囲の整数は、正確に表現されていると安全に仮定できます。

いずれにせよ、string.format()関数はその引数をプラットフォームのprintf(). と が理解するフォーマット文字列にprintf()%e%E「科学的」表記%fを強制するためと、単純な 10 進表記を強制するためのものがあります。また、最短表記%gを選択してください。%G

例えば:

E:\...>lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org、PUC-Rio
> a = 1e17/3
> print(string.format("%f",a))
33333333333333332.000000
> print(string.format("%e",a))
3.333333e+016
> print(string.format("%.0f",a))
3333333333333332

値が 32 ビットの符号付き整数の範囲内に収まる場合は、その%d形式も使用できることに注意してください。ただし、値がその範囲を超える場合、結果は明確に定義されません。マイクロ秒単位のシステム タイムスタンプは、32 ビットの範囲を超える可能性があります。

10 進数の 16 桁では精度が不十分な場合は、精度を上げるための選択肢がいくつかあります。

userdataまず、真の 64 ビット整数を適切な算術メタメソッドのセットと共にパッケージ化することは難しくありません。これはLua メーリング リストで時折議論されますが、完成したモジュールが誰かによってリリースされたのを見た記憶がありません。

次に、Lua の作成者の 1 人が、任意精度演算をサポートする 2 つのモジュールをリリースしました: lbc と lmapmです。どちらもそのページにあります。

第 3 に、Google で何気なく検索すると、他の数学ライブラリ ラッパーがすぐに見つかります。

于 2009-07-15T21:04:33.943 に答える