1

我正在使用一个数据库,该数据库的限制是它可以存储的唯一(数字)数据类型double。我想要做的是选择某一行的数字并将其放入 HTTP 请求中。问题围绕着我不知道这个数字是否应该有小数。

例如,如果 double 是一个 ID,我就不能有任何格式,因为获取HTTP 请求的站点会被混淆。请注意以下示例:

site.com/showid.php?id=12300000 // OK
site.com/showid.php?id=1.23E7 // Bad; scientific notation
site.com/showid.php?id=12300000.0 // Bad; trailing decimal

解决方案是将其转换为 long。忽略溢出长的问题,它解决了科学记数法和(显然)尾随小数。这可能是一个可接受的解决方案,但如果代码不假定它是我们正在处理的 ID,那就太好了。例如,如果我要查询一个显示地图的站点,并且数字是坐标,其中小数点非常重要,该怎么办?然后不再接受长期转换。

简而言之;

  • 如果双精度数没有小数,请不要添加尾随小数。
  • 如果它有小数,请全部保留。
  • 这两种情况都不应该有科学记数法或千位分隔符。

该解决方案将同时移植到 C# 和 Java,因此我接受两种语言的答案。(哦,我不知道如何称呼这个问题,如果你有更好的东西,请随时重命名。)

4

6 回答 6

3

为了补充 gustafc 的答案(他比我快 1 分钟),这里是 C# 的相关代码行:

MyDouble.ToString("0.################")

或者

string.Format("{0:0.################}", MyDouble);
于 2009-10-28T08:53:29.403 回答
2

既然如果它是整数(无论它代表一个 ID 还是一个坐标),格式化没有尾随零的值是安全的,为什么不直接编写你在项目符号中描述的逻辑呢?例如(C#,但应该很容易翻译成 Java):

// Could also use Math.Floor, etc., to determine if it is integral
long integralPart = (long)doubleValue;
if ((double)integralPart == doubleValue)
{
  // has no decimals: format it as an integer e.g. integralPart.ToString("D") in C#
}
else
{
  // has decimals: keep them all e.g. doubleValue.ToString("F17")
}
于 2009-10-28T08:31:28.420 回答
1

将数字封装在自定义类型中怎么样?

public class IntelligentNumber
{
    private readonly double number;

    public IntelligentNumber(double number)
    {
        this.number = number;
    }

    public override string ToString()
    {
        long integralPart = (long)this.number;
        if((double)integralPart == this.number)
        {
            return integralPart.ToString();
        }
        else
        {
            return this.number.ToString();
        }
    }
}

另请参阅 Vilx- 的答案以获得比上述算法更好的算法。

于 2009-10-28T08:39:17.673 回答
0

检查是否 num == round(num)

于 2009-10-28T08:33:19.417 回答
0

在 Java 中,您可以使用DecimalFormat来做到这一点。

static String format(double n) { 
    return new DecimalFormat("0.###########################").format(n); 
}

#除非数字不是零,否则占位符不会出现,除非后面有东西,否则小数点不会出现。

于 2009-10-28T08:51:23.920 回答
0

以下是我自己的结论:

  • 检查双精度是否有小数。
  • 根据这一点,相应地格式化字符串。
  • 然后是一些重要的事情;如果不指定不变的区域性,小数部分中的逗号可能是“,”而不是“。” HTTP 请求不喜欢它。当然,只有当您的操作系统设置为喜欢逗号的语言环境时,才会出现此问题。

    public static string DoubleToStringFormat(double dval)
    {
        long lval = (long)dval;
        if ((double)lval == dval)
        {
            // has no decimals: format as integer
            return dval.ToString("#.", CultureInfo.InvariantCulture);
        }
        else
        {
            // has decimals: keep them all
            return dval.ToString("0.##################", CultureInfo.InvariantCulture);
        }
    }
    
于 2009-10-28T09:22:27.677 回答