Floating point 如何在Haxe中将浮点数可靠地格式化为指定的小数位数
我想知道是否有一种可靠的方法可以将haxe中的Floating point 如何在Haxe中将浮点数可靠地格式化为指定的小数位数,floating-point,haxe,Floating Point,Haxe,我想知道是否有一种可靠的方法可以将haxe中的浮点x转换为具有指定小数位数的字符串,例如3 一种简单的方法是首先将x转换为字符串表示形式,然后在小数点后的给定字符数后修剪所有内容,如图所示。但是,如果某个平台显示的数字如0.0111为1.11e-2,会发生什么情况 我似乎在haxe中也找不到printf,这将允许我以正确的方式格式化数字。我想知道在haxe中这样做的最佳实践是什么 我想在结果中获取字符串,因为在某些系统中,浮点数会给您提供,例如,0.19999。。从2/10.0。仅仅在小数点后截
浮点
x
转换为具有指定小数位数的字符串
,例如3
一种简单的方法是首先将x
转换为字符串表示形式,然后在小数点
后的给定字符数后修剪所有内容,如图所示。但是,如果某个平台显示的数字如0.0111
为1.11e-2
,会发生什么情况
我似乎在haxe中也找不到printf
,这将允许我以正确的方式格式化数字。我想知道在haxe中这样做的最佳实践是什么
我想在结果中获取字符串,因为在某些系统中,浮点数会给您提供,例如,
0.19999
。。从2/10.0
。仅仅在小数点后截断一定数量的字符是不准确的。如果你能满足于仅仅四舍五入到一定的精度,那么你可以使用这样简单的方法
/**
Uses Math.round to fix a floating point number to a set precision.
**/
public static function round(number:Float, ?precision=2): Float
{
number *= Math.pow(10, precision);
return Math.round(number) / Math.pow(10, precision);
}
摘自Franco Ponticelli的THX图书馆:
如果你想要一些更像PrintF的东西,但是重量很轻,也许可以看看相关的代码,把打印浮动的部分拉出来,达到一定的精度。如果您只需要这一项功能,您可以安全地忽略其中的许多其他功能。公共静态函数floatToStringPrecision(n:Float,prec:Int){
public static function floatToStringPrecision(n:Float, prec:Int){
n = Math.round(n * Math.pow(10, prec));
var str = ''+n;
var len = str.length;
if(len <= prec){
while(len < prec){
str = '0'+str;
len++;
}
return '0.'+str;
}
else{
return str.substr(0, str.length-prec) + '.'+str.substr(str.length-prec);
}
}
n=数学圆(n*数学功率(10,prec));
var-str=''+n;
var len=str.length;
if(len MAX_INT)在某些平台上,因此在这种情况下,您需要自己的舍入函数。这里有一些优化版本。一般函数快20%左右,3位小数的特定版本快50%。避免了可能创建字符串和字符串串联,也避免了精度问题的分割
public static function floatToStringPrecision(n:Float,prec:Int)
{
if(n==0)
return "0." + ([for(i in 0...prec) "0"].join("")); //quick return
var minusSign:Bool = (n<0.0);
n = Math.abs(n);
var intPart:Int = Math.floor(n);
var p = Math.pow(10, prec);
var fracPart = Math.round( p*(n - intPart) );
var buf:StringBuf = new StringBuf();
if(minusSign)
buf.addChar("-".code);
buf.add(Std.string(intPart));
if(fracPart==0)
{
buf.addChar(".".code);
for(i in 0...prec)
buf.addChar("0".code);
}
else
{
buf.addChar(".".code);
p = p/10;
var nZeros:Int = 0;
while(fracPart<p)
{
p = p/10;
buf.addChar("0".code);
}
buf.add(fracPart);
}
return buf.toString();
}
公共静态函数floatToString精度(n:Float,prec:Int)
{
如果(n==0)
返回“0”。+([for(i in 0…prec)“0”]。join(“”);//快速返回
变量符号:布尔=(你试过吗?@lordkryss谢谢。我会看一看。代码是1k行。我想我正在寻找一个更轻量级的解决方案,只是为了将数字舍入到正确的位置,因为我打算将此函数移植到其他语言,基于haxe。谢谢。我在乘除法中遇到的一个问题是,我得到了如下数字0.19999..2/10.0。这会在转换为字符串时产生问题。不过,最好的做法仍然是使用一个haxe printf实现。但是,如果您不想添加大量代码(=大小),则使用自己的函数是您的方式。谢谢您的回答。它很有效。我最终也编写了自己的函数。
public static function floatToStringPrecision3(n:Float)
{
if(n==0)
return "0.000";
var minusSign:Bool = (n<0.0);
n = Math.abs(n);
var intPart:Int = Math.floor(n);
var p:Float = 1000.0; //pow(10, 3)
var fracPart = Math.round( p*(n - intPart) );
var buf:StringBuf = new StringBuf();
if(minusSign)
buf.addChar("-".code);
buf.add(Std.string(intPart));
if(fracPart==0)
buf.add(".000");
else
{
if(fracPart<10)
buf.add(".00");
else if(fracPart<100)
buf.add(".0");
else
buf.add(".");
buf.add(fracPart);
}
return buf.toString();
}