如何可靠地将浮点数格式化为Haxe中指定的小数位数

时间:2014-05-15 21:28:20

标签: floating-point haxe

我想知道是否有reliable方式将haxe中的Float x转换为具有指定小数位数的String,例如3。

一种简单的方法是首先将x转换为字符串表示形式,然后在小数点.之后的给定数量的字符后修剪所有字符,如图here所示。但是,如果某个平台将0.0111这样的数字显示为1.11e-2

,会发生什么情况

我似乎无法在haxe中找到printf,这样我就能以正确的方式格式化数字。我想知道在haxe这样做的最佳做法是什么。

我想在结果中获取字符串,因为在某些系统中,浮点数会为您提供0.19999 ..来自2/10.0。只是在小数点后截断一定数量的字符是不准确的。

3 个答案:

答案 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;
})