我想知道是否有reliable
方式将haxe中的Float
x
转换为具有指定小数位数的String
,例如3。
一种简单的方法是首先将x
转换为字符串表示形式,然后在小数点.
之后的给定数量的字符后修剪所有字符,如图here所示。但是,如果某个平台将0.0111
这样的数字显示为1.11e-2
?
我似乎无法在haxe中找到printf
,这样我就能以正确的方式格式化数字。我想知道在haxe这样做的最佳做法是什么。
我想在结果中获取字符串,因为在某些系统中,浮点数会为您提供0.19999
..来自2/10.0
。只是在小数点后截断一定数量的字符是不准确的。
答案 0 :(得分:4)
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);
}
}
在某些平台上,对于大数字(&gt; MAX_INT)可能会失败,因此在这种情况下,您需要自己的圆函数。
答案 1 :(得分:3)
如果你能够满足于一定程度的精确度,那么你可以使用像这样简单的东西。
/**
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图书馆:https://github.com/fponticelli/thx/blob/master/src/Floats.hx#L206
如果你想要更像PrintF的东西,但重量很轻,可以看一下相关的代码,然后拉出与浮动到一定精度的位。如果您只想要这一功能,那么您可以放心地忽略许多其他功能。
答案 2 :(得分:0)
以下是优化版本。一般功能快20%左右,3位小数的特定版本快50%。避免创建字符串和字符串连接是可行的,并且还避免了精度问题的划分
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();
}
案例的特定函数prec = 3
this.$nextTick(function() {
$('#thing')[0].scrollTop = $('#thing')[0].scrollHeight;
})