C++ 用于浮点值的最佳变量类型

C++ 用于浮点值的最佳变量类型,c++,sql,sql-server,printf,C++,Sql,Sql Server,Printf,我在SQLServer数据库中有一个FLOAT列,在SQLServerManagementStudio中显示如下 18.001 当我将该值读入浮点变量,并使用sprintf%f对其进行格式化时,它显示为: 18.000999 当我将该值读入一个双变量,并使用sprintf对其进行格式化时,它显示为: 18.001000 我能得到一些建议吗?存储的值通常在100以下,最多有3位小数。最好的SQL Server类型是什么?什么是最好的C++类型?我应该使用一些舍入技术来获得我想要的格式吗 注意:我实

我在SQLServer数据库中有一个FLOAT列,在SQLServerManagementStudio中显示如下

18.001

当我将该值读入浮点变量,并使用sprintf%f对其进行格式化时,它显示为:

18.000999

当我将该值读入一个双变量,并使用sprintf对其进行格式化时,它显示为:

18.001000

我能得到一些建议吗?存储的值通常在100以下,最多有3位小数。最好的SQL Server类型是什么?什么是最好的C++类型?我应该使用一些舍入技术来获得我想要的格式吗

注意:我实际上没有使用sprintf,我使用的是CString.Format,但预期的行为是相同的

存储的值通常在100以下,最多有3位小数

SQL数据库支持数字/十进制,这两种是定点值的同义词类型。对于您的特定类型,可以使用小数6,3。这是六个有效数字,其中三个在小数点的右边。这两个值分别称为比例和精度

如果值与此略有不同,则可能需要更大的范围


对于十进制/数字,所见即所得。我建议将它们作为定点数字存储在数据库中。

除了固定的逗号小数之外,只需使用普通整数

代替存储18.001秒,您将存储18001毫秒,您将不会存储欧元、英镑、美元,而是存储十分之一美分或便士


<> C++中的类型也将是一个整数,足够大,以容纳你需要的最大数目。Guint32\u t,int64\u t,…

回答有关其面值的问题,假设应使用浮点,而不适用定点


<>除非你的内存非常紧,否则没有理由在C++中使用任何浮点数,但要加倍。浮动会降低精度,但不会给您带来太多回报。你也可以尝试长双,但以我的经验,这是相当过分。另外,如果你的编译器是MSVC,我听说它的双倍是双倍的。

你知道最好的C变量来保存这样的值吗?最大的问题是它的正确C++数据类型。@ Sergya我可能会将值缩放为我的SELECT语句中的整数,或者创建一个视图。这样,你就可以将值存储在普通的C++ int中,并享受通常的原始类型的所有性能和便利性。但是,我有一些通用的浮点列类。我真的不想把小数位数限制在一个固定的数字上。假设IEEE754,浮点不太适合表示货币值。请注意,即使一个最简单的值,如0.2是周期性的二进制,所以不能准确表示,无论你考虑浮动或双。带有整数的固定逗号算术总是精确的,但如果e。G需要计算利息。你需要一些四舍五入。Gvalue=value*107+50/100,但您可以始终在您真正需要的特定点上使用它,并且可以根据需要轻松选择舍入策略。如果您仍然坚持使用浮点,那么我会选择可用的最高精度,即。E双精度或甚至双长。如果你关心精度,C++得到浮点<双>长双。@纳达:对,但这似乎是一个超过100的值的过度杀戮。@ JonathanWood如果你关心精度,它不是。@ Sergya:为什么我需要一个3小数位数的长的双?看起来更像是一个格式问题。@JonathanWood数字不能用浮点表示。精度越高,就越接近实际数字。