【问题标题】:C# convert "double" to "ushort"C# 将“double”转换为“ushort”
【发布时间】:2015-06-24 09:51:12
【问题描述】:

我坚持使用变量格式。我知道这是一个愚蠢的问题,但我花了 2 个小时来解决这个问题,我正在失去理智。

问题是:

我有:

command.Data = new ushort[] { xx, yy, zz };

我需要这样做:

ushort zz = System.Math.Tan(c1AngleX);

但是 System.Math.Tan 的输出是“double”,所以我不能在那里使用“ushort”。

我试过了

ushort zz = (Convert.ToUInt16 (System.Math.Tan(c1AngleX));

但它不起作用。 (无法将“double”转换为“string”)

有什么方法可以将“double”转换为“ushort”?

(如果这个问题“太琐碎”,我很抱歉,但我真的卡住了)

【问题讨论】:

  • 如果你把System.Math.Tan(c1AngleX)的结果转换成ushort你会丢失数据。
  • 您将 double 转换为 ushort 的方法是正确的,但这会导致数据丢失。
  • 没有这样的错误:“它不起作用”。请更具体。
  • "...抛出带有消息的System.ItDoesNotWorkException..."
  • 首先避免ushort。这应该是稀有的。

标签: c# double converter ushort


【解决方案1】:

您似乎遇到的问题是从浮点类型转换为整数类型会丢失小数。

如果您对值 0.111333423 进行转换(假设这是 Tan 的结果)zz 将具有值 0,因为所有小数都将被删除。而且由于ushort 也是未签名的,因此也不会转移符号。

例如,有一些方法可以处理整数类型中的小数,称为定点整数。但这是假设您出于任何原因确实需要使用 ushort (或任何整数类型)。在使用此类函数时,应避免因数据丢失而导致的整数类型。

【讨论】:

  • 不仅仅是小数。这也是可能不适合ushort的标志。
  • @JeffRSon 谢谢,我忘记了未签名的部分。将其添加到我的答案中。
  • 好吧,由于符号的原因,结果可能完全错误。尝试使用(ushort) cast 和 1.9 的参数。它将导致 65534。Convert.ToUnit16 将抛出 OverflowException
  • @JeffRSon 你在说什么?如果你将一个值为 1.9 的 double 显式转换为 ushort,你会得到 1,而不是 65534。
  • @juharr:谈论 System.Math.Tan。
【解决方案2】:

ushort 是一个 16 位变量,可以保存 0 到 65535 之间的整数值。 double 是一个 8 字节的变量,可以保存 .. 很多值,包括分数。

因此,如果您将双精度转换为 ushort,您可能会丢失数据。这就是为什么系统不会让你在没有明确指示的情况下这样做的原因。

最简单的转换方法是使用转换运算符:例如

double d = 99.99;
ushort u = (ushort)d;

或者您可以使用显式舍入或截断双精度数的数学函数之一进行转换,但它们返回双精度数,因此您仍然必须进行转换。

您应该首先考虑为什么要将双精度值放入 ushort 类型。为正确的行为而设计远比仅仅因为你可以就将圆形钉子挤进方形钉子更重要。

【讨论】:

  • 我推荐 Convert.ToUInt16 而不是演员表。我有一个案例,(ushort)(0.57*100) 给出了不正确的结果 56。使用 Convert.ToUInt16(0.57*100) 正确返回 57.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
相关资源
最近更新 更多