当前位置: 首页 > 知识库问答 >
问题:

java中的表达式,用于将双精度值格式化为特定的小数点

喻子航
2023-03-14

我有一系列这样的数据:100 Mbps,200 Mbps,512 Kbps,256 Kbps,100 Mbps,

我需要标准化所有必须在“Mbps”单元中的数据。我正在使用Jaspersoft的ETL软件,该软件允许输入表达式来转换数据。每个数据将被分成两个变量,一个用于存储单位(speedunit),另一个用于存储值(speedvalue),类型为Double。现在,我使用以下表达式:

speedunit.equalsIgnoreCase("Kbps") ? (speedvalue / 1000) : speedunit.equalsIgnoreCase("Gbps") ? (speedvalue * 1000) : Var.speedvalue 

问题是,它将值舍入为整数。假设512为0.512,但显示1。数学圆形也没有帮助。我不能放入任何用户定义的函数。只允许表达式。所以它必须是一个线性表达式,如示例中所示

格式化后的值将保存到MSSQL表的列中,该列的类型为“decimal(28,2)”

更新:尝试了这个,但也没有成功

speedunit.equalsIgnoreCase("kbps") ? Mathematical.REAL(String.valueOf(speedvalue/1000))

这会导致错误“DecimalFormat无法解析为类型”

speedunit.equalsIgnoreCase("kbps") ? new DecimalFormat("0.00").format(String.valueOf(speedvalue / 1000)))

共有2个答案

颛孙信厚
2023-03-14

你可以使用类型转换来加倍这里。所以你的表达式可以是这样的

speedunit.equalsIgnoreCase("Kbps") ? 
    (double)(speedvalue / 1000) 
    : speedunit.equalsIgnoreCase("Gbps") ? (double)(speedvalue * 1000) 
    : speedvalue

计算10/100将得到0,其中计算10/100将得到0.1

如果您想将小数限制为特定的位数,可以使用以下表达式(限制为两位小数)

speedunit.equalsIgnoreCase("Kbps") ? 
    (double)Math.round(100*((double)(speedvalue / 1000))/100 
    : speedunit.equalsIgnoreCase("Gbps") ? 
    (double)Math.round(100*((double)(speedvalue * 1000))/100 
    : speedvalue

如果要限制为三位小数,请将100更改为1000。使用java。文本十进制格式是一种更好的数字格式。与数学一起使用乘法和除法。round()是一种解决方案,这种库不可用。

如果您可以使用DecimalFormat,那么您的最佳解决方案将是

speedunit.equalsIgnoreCase("Kbps") ? 
    new DecimalFormat("0.00").format(String.valueOf((double)(speedvalue / 1000))/100 
    : speedunit.equalsIgnoreCase("Gbps") ? 
    new DecimalFormat("0.00").format(String.valueOf((double)(speedvalue * 1000))/100 
    : speedvalue

楚冷勋
2023-03-14

这里有一个演示给你:

import java.text.DecimalFormat;


public class DecimalFormatDemo {

    public static void main(String[] args) {
        String speedunit = "Kbps";
        double speedvalue = 512;
        double result = 
                speedunit.equalsIgnoreCase("Kbps") ? (speedvalue / 1000) : speedunit.equalsIgnoreCase("Gbps") ? (speedvalue * 1000) : speedvalue;
        DecimalFormat df = new DecimalFormat("0.000");
        System.out.println(df.format(result));

    }
}

注:

由于speedvalue是“double”类型,将结果分配给double类型的变量就足够了。然后只需要将结果格式化为所需的十进制格式。

 类似资料:
  • 问题内容: 我有一个类似的双精度数字,我需要把它显示为。 如何用Java做到这一点? 问题答案: 结果是 这是我最接近的。

  • 问题内容: 我正在编写一个简单的Java程序。我需要从输入中获取一个字符串并将其分为两部分:1-double 2-string。然后,我需要对double进行简单的计算,并将结果发送到具有特定精度的输出(4)。它工作正常,但是当输入为0时出现问题,则不能正常工作。 例如,对于这些输入,输出将是: 1公斤 输出:2.2046 3.1公斤 输出:6.8343 但是当输入为0时,输出应为0.0000,但

  • IEEE 754浮点数是离散的。 查看此代码在IdeOne上的实时运行。通用域名格式。在JDK8中运行时,输出是 浮点值按预期打印。我预计双倍值0.1d会像1.000000000000000055511151231260一样打印。为什么它在分数部分打印所有零? 如果我把双变量d转换成字符串,它会输出0.1。 java如何将0.1d(大约为1.0000000 149011938476565E-1)的

  • 问题内容: 是一个字符串,而%d是一个小数,我想…但是放入时 ..引发异常,告诉我!= lang.double。有想法吗? 问题答案: 是供整数使用的,它同时适用于和类型:

  • 问题内容: 我想四舍五入: 至: 我已经使用了这两种方法: 和 但它一直在打印: 有人对此有解决方案吗?因为我真的认为这应该可行。谢谢你的帮助。 问题答案: 您的第一个解决方案确实非常接近。只是这样做: 您的版本无法正常运行的原因是,您使用了double格式,使用2dp将其格式化为,然后又将其转换回了。 然后照常打印,没有特殊的小数位规则。

  • 我想用一个小数点和一个小数位的格式将任何双精度四舍五入为双精度,这样29575.347434将是2.3。 我试着用decimalFormat做这个,但当我试着我只得到了一个29575.3格式的字符串,带有一个,我不知道如何在保留值为双精度的同时去掉所有小数点。