当前位置: 首页 > 面试题库 >

在JScience库中转换不同的单位类型

解翰采
2023-03-14
问题内容

我正在JScience库中寻找一种将一种单位类型转换为另一种单位类型的方法。给定每种类型的基本单位之间的因子,我应该可以转换。但是,似乎JScience对于转换不是很好,只允许在相同基本类型的单元之间进行转换。

基本上,我正在编写一个减肥应用程序,我需要能够在卡路里,焦耳,千焦耳,克,磅,千克等之间进行转换。它的营养成分丰富,包括碳水化合物,碳水化合物和脂肪含量。

例:

每1克碳水化合物= 4卡路里。那是4000卡路里,或16.736千焦耳,或16736焦耳(能量的基本单位)。

然后将Carb_Unithtml" target="_blank">定义为:16736焦耳/克或16736000焦耳/千克

有了这个基本值,我应该能够从任何质量单位转换为任何能量单位。但是同样,JScience不允许这样做。有没有办法告诉转换器返回具有正确转换因子的转换器,而又不给出ConversionException?

CustomUnits.java:

public class CustomUnits extends SystemOfUnits {

    /**
     * Holds collection of CustomUnits.
     */
    private static HashSet<Unit<?>> UNITS = new HashSet<Unit<?>>();

    private static <U extends Unit<?>> U customUnits(U unit) {
        UNITS.add(unit);
        return unit;
    }

    @Override
    public Set<Unit<?>> getUnits() {
        return Collections.unmodifiableSet(UNITS);
    }

    public static final Unit<Energy> KILOCALORIE = customUnits(SI.JOULE.times(4184));
    public static final Unit<Energy> KILOJOULE = customUnits(SI.JOULE.times(1000));

    // Food units expressed as energy
    public static final Unit<Energy> CARBOHYDRATE_ENERGY = customUnits(KILOCALORIE.times(4));
    public static final Unit<Energy> PROTEIN_ENERGY = customUnits(KILOCALORIE.times(4));
    public static final Unit<Energy> FAT_ENERGY = customUnits(KILOCALORIE.times(9));

    // Food units expressed as mass
    public static final Unit<Mass> CARBOHYDRATE_MASS = customUnits(SI.GRAM);
    public static final Unit<Mass> PROTEIN_MASS = customUnits(SI.GRAM);
    public static final Unit<Mass> FAT_MASS = customUnits(SI.GRAM);
}

Main.java:

public static void main(String[] args) {

    Amount<?> carbEnergyUnit = Amount.valueOf(1, CustomUnits.CARBOHYDRATE_ENERGY);
    Amount<?> carbEnergyCalorie = carbEnergyUnit.to(CustomUnits.KILOCALORIE);
    Amount<?> carbEnergyKJ = carbEnergyUnit.to(CustomUnits.KILOJOULE);
    Amount<?> carbEnergyJoules = carbEnergyUnit.to(SI.JOULE);

    System.out.println(carbEnergyUnit.getExactValue() + "g of carb");       // 1g of carb
    System.out.println(carbEnergyCalorie.getExactValue() + " Calorie");     // 4 Calorie
    System.out.println(carbEnergyKJ.getEstimatedValue() + " KiloJoules");   // 16.735999999999997 KiloJoules
    System.out.println(carbEnergyJoules.getExactValue() + " Joules");       // 16736 Joules

    // Exception in thread "main" javax.measure.converter.ConversionException: lb is not compatible with J*16736
    UnitConverter toCarb = NonSI.POUND.getConverterTo(CustomUnits.CARBOHYDRATE_ENERGY);
    double result = toCarb.convert(4);
    System.out.println(result);
}

问题答案:

似乎JScience您已尝试将a转换Unit<Mass>为a Unit<Energy>,这在默认情况下是禁止的PhysicalModel

一种替代方法是为Quantity以下各个单元创建一个新的FoodEnergy

public static final Unit<Energy> KILOCALORIE = SI.JOULE.times(4184);

public interface FoodEnergy extends Quantity {

    public final static Unit<FoodEnergy> UNIT
        = (Unit<FoodEnergy>) SI.GRAM.times(KILOCALORIE);
}

private static final Unit<FoodEnergy> PROTEIN_ENERGY = FoodEnergy.UNIT.times(4);
private static final Unit<FoodEnergy> ETHANOL_ENERGY = FoodEnergy.UNIT.times(7);
…

然后,您可以合并特定能源的贡献:

Amount<FoodEnergy> beer =
    Amount.valueOf(2, PROTEIN_ENERGY).plus(
    Amount.valueOf(14, ETHANOL_ENERGY));
System.out.println(beer.to(FoodEnergy.UNIT).getEstimatedValue() + " Calories");

哪个打印105.99999999999997 Calories。您可以通过将a转换为NonSI.POUND来找到一磅蛋白质中的卡路里SI.GRAM

double grams = NonSI.POUND.getConverterTo(SI.GRAM).convert(1);
Amount<FoodEnergy> pound = Amount.valueOf(grams, PROTEIN_ENERGY);
System.out.println(pound.to(FoodEnergy.UNIT).getEstimatedValue() + " Calories");

哪个打印1814.3694799999998 Calories。最后,您可以从中恢复焦耳数FoodEnergy.UNIT

System.out.println(FoodEnergy.UNIT.divide(SI.GRAM));

哪些印刷品J*4184,或

System.out.println(FoodEnergy.UNIT.divide(SI.GRAM).toStandardUnit().convert(1));

哪个打印4184.0



 类似资料:
  • 问题内容: 我正在开发一个项目,该项目可以使用户随着时间的推移跟踪不同的数据类型。基本思想的一部分是用户应该能够使用他们需要的任何单位输入数据。我一直在看两个单元: http://pypi.python.org/pypi/units/ 和数量: http://pypi.python.org/pypi/quantities/ 但是我不确定最好的方法。据我所知,数量更为复杂,但包括更好的初始单位清单。

  • 问题内容: 我从UDP套接字获取了一个字节片(),并希望将其视为整数片(),而无需更改基础数组,反之亦然。在C(++)中,我只是在指针类型之间进行转换;我将如何在Go中执行此操作? 问题答案: 正如其他人所说,在Go中强制转换指针被认为是错误的形式。这是正确的Go方式示例以及与C数组转换等效的示例。 警告:所有代码未经测试。 在此示例中,我们使用包将每组4个字节转换为。这样更好,因为我们指定了字节

  • 问题内容: 为什么没有单元的情况下,以下转换在Firefox中不起作用?一旦添加单位,它就可以工作。似乎其他主要的浏览器对这些单位都漠不关心。 据我所知,这是过渡时间“ 0”的唯一示例,没有单位,在Firefox中不起作用。 您可以在JSFiddle上看到它的运行以及与单元的配合。 这是在JSFiddle上没有单元且相同的相同代码。 如您所见,Firefox是唯一似乎崩溃的浏览器。另外,这是代码:

  • 到目前为止,我在夸克斯的斯莫尔黑伊叛变中做了非常基本的事情。基本上,我有一两个非常小的web服务,它们只与web应用程序交互。这些服务返回一个

  • 我试图在java中实现不同类型之间的转换器:我有一个超级类foo,有2个子类: fo1和fo2,我也有2个不相关的其他类bar1和bar2,我试图实现一个转换器从bar1到fo1和bar2to fo2(与之相反)。 因为我在这里有继承,所以我想应该创建一个泛型类型的接口(将是bar1或bar2),它将定义转换所需的函数,我还想让转换器成为bar1和bar2的通用转换器,我认为它应该以某种方式使用接

  • JScience 是一个Java的科学计算包