问题标签 [unit-class-library]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
171 浏览

c# - 如何解决精度问题

我有几个类遵循相同的基本概念来处理单位。

这是一个在单元测试中使用的简单示例:

我已经制作了几个像这样演示的角度类的类,涵盖了其他基本单位类型。

向我揭示我遇到精度问题的特定类是使用处理长度单位的类:Dimension

我帮助构建了一个基本的几何库,利用这个 Dimension 类作为它的基本单元类型。例如,这是 Point 类:

线和其他形状具有由使用此点类构建的维度和端点表示的长度等属性。

当我试图判断这些线是否全部平行时,问题就变得很明显了。在这个函数中:

它通常会返回 false,因为它检查的精度太高。在使用点和线进行旋转和平移之后,舍入加起来刚好足以使该函数在我希望它返回 true 时返回 false。

所以:

以下哪一组选择是正确/更好的选择?

  • 只需检查IsParallelTo数字相对接近的功能(例如,在 0.0001 英寸内)

If(Math.Abs​​(thing.x - thing2.x) < .0001)

  • 使用从配置文件中提取的变量常量改进了先前的想法,因此允许用户选择所需的可接受偏差

If(Math.Abs​​(thing.x - thing2.x) < Properties.AcceptedDeviationConstant)

  • 或在维度类的根级别减少问题:

我可以使用相同的策略

它真的看起来像这样,但上面更容易理解

return (Math.Abs​​(this.GetValue(this.InternalUnitType) - ((Dimension)(obj)).GetValue(this.InternalUnitType))) < Constants.AcceptedEqualityDeviationConstant;

或者最后,我的最后一个想法是将我的单位类中的所有内容替换为基本单位,Decimal而不是Double(维度、角度等)替换为十进制,并以某种方式(在研究之后)弄清楚这是否会有所帮助。


我应该如何以及在哪里提高班级平等运算的精度一致性?

ps 这些库是开源的,可以找到(此处的单位此处的几何)

0 投票
0 回答
72 浏览

c# - 如何定义 nuget 包的必要版本?

我正在尝试确定如何确定 nuget 包的版本号。

我假设这将在 packages.config 文件中。在 packages.config 文件中,这是它正在寻找的版本号:<package id="UnitClassLibrary" version="1.1.0" targetFramework="portable-net40+sl40+win+wp" />同样,在 .csproj 文件中,它正在寻找<Reference Include="UnitClassLibrary, Version=1.1.0, Culture=neutral, processorArchitecture=MSIL">.

所以我在这两个文件中都定义了对 1.1.0 版本的需求。但是,当我尝试运行 nuget restore 命令时,它报告Unable to find version '1.10' of package 'UnitClassLibrary'.我找不到任何将 nuget 版本定义为1.10.

0 投票
1 回答
101 浏览

c# - 单元类智能操作员的可扩展解决方案

我运行这个开源库,巧妙地命名为Unit Class Library。它的目的,像许多其他人一样,是允许更智能地处理单位(四舍五入,转换等)。这里是图书馆的一个例子

显然,*运算符在 Distance 类中被重载,如下所示:

在尝试在实际应用程序中使用该库时,我需要使用这些类型做一些复杂的方程,并且目前必须将我的所有单位减少回任意双精度数来进行数学运算:

假设我们正在计算体积流量

(这只是一个例子。由于积分和导数,我的实际应用程序中的方程以距离 ^ 5th 和其他奇怪的单位结束。)

这是一个令人不快的解决方案,因为它会导致不必要的转换。这引入了不必要的舍入误差。而且我知道我可以制作一个操作员来处理这个问题。

Tangent

如果您查看库的其余部分,您会发现从传入的值到不同单位的转换被延迟到需要它时。这确保了只要它与给定的单位相同,您将始终返回与输入相同的值。像这样:

end Tangent

我希望能够做到这一点:

无需编辑 Volume 类以包含新运算符。

我可以进入适当的位置并为每个新组合添加一个新的运算符,当它添加到库时应该返回 VolumetricFlowRate,但这很乏味并且违反了开放封闭原则。

有没有人提出一个解决方案的建议,该解决方案可以用每种新类型进行干净扩展,但又不违反开放封闭原则?

0 投票
1 回答
784 浏览

c# - 尝试序列化时出现自引用循环错误

我正在尝试序列化一个对象(特别是开源 UnitClassLibrary 中的一个距离对象)。因为这个库显然不支持序列化,所以我愿意为我的目的对其进行修改。

但是,我不确定如何诊断正在发生的这个问题。尝试使用 JSON.net 序列化对象时出现以下错误(我也尝试使用内置工具进行 XML 序列化并得到类似的错误)。

Additional information: Self referencing loop detected for property 'EqualityStrategy' with type 'UnitClassLibrary.DistanceEqualityStrategy'. Path ''.

但是,我似乎在距离对象的代码中找不到任何自引用循环。我该如何诊断这个问题?

我目前只是想像这样序列化:

这导致了错误。我可以修改我正在使用的库,但我没有。

0 投票
1 回答
622 浏览

c# - 构建一个 JsonConstructor 能够反序列化我的对象

我正在使用 JSON.net 并试图序列化和反序列化来自开源 UnitClassLibrary 的 Distance 对象。目前,我有一个序列化为以下 JSON 的对象:

我可以使用其中任何一个并将其转换为使用此类的距离对象。例如,使用最后一个架构字符串,我可以使用这个构造函数:

或者,使用 32 英寸,我可以这样做:

但是,我不确定编写 JsonConstructor(JSON.net 可以专门使用的构造函数类型)在传递带有JsonConvert.DeserializeObject<Distance>(json);.

如何编写构造函数来获取新的距离对象?