在我们的应用程序中,我们目前的决定是将所有工程数据存储在SI中的数据库中.
我担心在我们的数据库或.NET数字类型中我们可能会冒不具备足够精度和准确性的风险.我也担心我们可能会看到浮点数学的假象(虽然这可能是一个问题本身).
例如,源数据可能是以Psi(磅/平方英寸)表示的压力量(并从某些第三方服务读入).工程师将选择这个度量单位,因为(对于表达的数量),这将倾向于提供易于消化的,人类可读的数字而无需科学记数法.
当我们"标准化"数字时,即当我们将这个数量转换为我们自己的持久性时,我们可能会将其转换为Pa(帕斯卡),这需要将数字乘以或除以其他可能的大数字.
我们经常最终存储非常大或非常小的数字,更糟糕的是 - 我们可能会对这些数字做进一步的计算.
目前我们使用ORACLE float和System.Double.
人们怎么想这个?
UPDATE
进一步的研究已经在即将推出的F#语言(我写的CTP中)中发现了度量单位支持.
看来我们能够让F#了解用户输入,例如:
9.81<n/s^2> // an acceleration
Run Code Online (Sandbox Code Playgroud)
我们还可以创建自己的派生单位和单位系统.

(来源:msdn.com)
C#/ .NET库是否内置例程或常量,例如将毫米转换为英寸?如果是这样,我在哪里可以找到它们?(我只是不想一次又一次地生成重复的代码.)
我想在JScience 中定义一个新的距离单位。项目网站的“教程”部分只是指向 Javadoc,它虽然相当完整,但对我来说有点过于密集,无法理解我实际上是如何定义自己的单元的。
你能举个例子吗?
干杯。
皮特
我开始学习如何在F#中使用度量单位,但我还没有找到这个简单问题的答案.如何在计算后打印结果单位.我知道FSI打印它们所以它们应该以某种方式可用.
例如:
[<Measure>] type m;;
[<Measure>] type s;;
let d = 10<m>;;
val d : int<m> = 10
let t = 2<s>;;
val t : int<s> = 2
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
printfn "Results: %A %A" (d / t) (UOM (d / t));;
"Results: 5 m/s"
Run Code Online (Sandbox Code Playgroud)
提前致谢
使用Delphi 2010 ...我有一组想要组合在一起的二进制属性.我把它定义为......
type
TTableAttributeType = (
tabROOT = 1,
tabONLINE = 2,
tabPARTITIONED = 3,
tabCOMPRESSED = 4,
);
// Make a set of of the Table Attribute types...
type
TTableAttrSet = Set of TTableAttributeType;
Run Code Online (Sandbox Code Playgroud)
在我的MAIN.PAS单元中,我可以创建一个TTableAttrSet类型的变量.另一个单元,UTILS.PAS也需要了解TTableAttrSet类型.这由USES条款处理......
Main USES Util ... Util使用Main(第二个使用条款,在实现部分,所以我没有得到循环引用问题....
到现在为止还挺好.我的问题是我需要将TTableAttrSet FROM main类型的var变量传递给Utils.
在main.pas
procedure TForm1.Button1Click(Sender: TObject);
var
TabAttr : TTableAttrSet;
begin
TestAttr (TabAttr);
end;
Run Code Online (Sandbox Code Playgroud)
在UTILS.PAS,我有
procedure TestAttr(var Attr: TTableAttrSet);
begin
Attr := [tabROOT, tabCOMPRESSED];
end;
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我遇到了几个问题......问题1).当我在utils.pas的顶部定义我的过程定义时,
procedure TestAttr(var Attr: TTableAttrSet);
Run Code Online (Sandbox Code Playgroud)
我得到的错误是TTableAttrSet是一个未声明的标识符.这是有道理的,因为定义在Main.pas中,'使用Main.pas'是在我的过程定义之后.我该如何解决这个问题?目前,我已经在Utils.pas文件和Main.pas的顶部复制了TTableAttrSet类型定义,但这似乎并不"正确".
问题2).我遇到的更大问题是编译错误.在Main.pas的主叫线上
TestAttr(TabAttr);
Run Code Online (Sandbox Code Playgroud)
我得到错误'实际和正式var参数的类型必须是标识的'.据我所知,他们是完全相同的.什么是编译器抱怨?
有谁知道为什么[<Measure>]类型只增加了一些代数类型?如此多的有用类型无法使用Measure进行扩充对我来说很奇怪.
type FooType =
| FooByte of byte<1> // Error
| FooSbyte of sbyte<1> // Ok
| FooInt16 of int16<1> // Ok
| FooUint16 of uint16<1> // Error
| FooInt of int<1> // Ok
| FooInt32 of uint32<1> // Error
| FooInt64 of int64<1> // Ok
| FooUint64 of uint64<1> // Error
| FooNativeint of nativeint<1> // Error
| FooUnativeint of unativeint<1> // Error
| FooChar of char<1> // Error
| FooDecimal of decimal<1> // Ok
| FooFloat32 of float32<1> …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何将带有度量单位的小数转换为带有度量单位的浮点数.
我一直在尝试类似于以下的代码:
let toFloat (value: decimal<'T>) =
let value = float (value / LanguagePrimitives.GenericOne<decimal<'T>>)
value * LanguagePrimitives.GenericOne<float<'T>>
Run Code Online (Sandbox Code Playgroud)
这个方法产生一个decimal - > float的签名,这不是我想要的.我正在尝试创建一个decimal <'T> - > float <'T>类型的函数.
有可能创建这样的功能吗?如果是这样,它会是什么样子?
我想percent用Boost.Units 实现一个单元,这样无量纲的数量(比如一个比例)可以表示为百分比.我已成功实现了质量密度单位之间的转换,但同样不适用于无量纲单位.这是我的代码(假设using namespace boost::units;):
//
// gram per milliliter (g mL^-1)
//
namespace my {
struct gram_per_milliliter_base_unit :
base_unit<gram_per_milliliter_base_unit, mass_density_dimension, 1>
{
static std::string name() {return "gram per milliliter";}
static std::string symbol() {return "g mL^-1";}
};
typedef gram_per_milliliter_base_unit::unit_type gram_per_milliliter_unit;
BOOST_UNITS_STATIC_CONSTANT(gram_per_milliliter, gram_per_milliliter_unit);
BOOST_UNITS_STATIC_CONSTANT(grams_per_milliliter, gram_per_milliliter_unit);
}
BOOST_UNITS_DEFINE_CONVERSION_FACTOR(
my::gram_per_milliliter_base_unit, si::mass_density, double, 1.0e3
); // 1 g mL^-1 == 1e3 kg m^-3 (SI unit)
BOOST_UNITS_DEFAULT_CONVERSION(my::gram_per_milliliter_base_unit, si::mass_density);
//
// percentage (%)
//
namespace my {
struct percent_base_unit :
base_unit<percent_base_unit, dimensionless_type, 2> …Run Code Online (Sandbox Code Playgroud) 我想在我的C#项目中使用UnitsNet,并在文档中看到作者正在使用他们的类来解析来自字符串的度量单位,如下所示:
var usEnglish = new CultureInfo("en-US");
Mass kg = Mass.Parse(usEnglish, "1.0 kg");
Run Code Online (Sandbox Code Playgroud)
我想以同样的方式使用它,所以我通过调用使用nuget控制台在我的项目中安装了包:
Install-Package UnitsNet
Run Code Online (Sandbox Code Playgroud)
并确保在项目中添加引用.
问题是我仍然无法在任何单元类型上看到Parse()/ TryParse()方法.
我做错了什么,或者文档是否过时了?
我有一个在列中缩写数值的数据集。例如,12M表示1200万,1.2k表示1200。M和k是唯一的缩写。如何编写允许R将这些值从最低到最高排序的代码?
我虽然已经使用gsub将M转换为000,000等,但这并没有考虑到小数点(1.5M将是1.5000000)。