Floating point 如何在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。仅仅在小数点后截

我想知道是否有一种可靠的方法可以将haxe中的
浮点
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();
}