【问题标题】:get decimal part of number in MS Access在 MS Access 中获取数字的小数部分
【发布时间】:2023-03-12 03:20:01
【问题描述】:

如何在 MS Access 中访问数字的小数部分?更具体地说,我只想要小数点后的组件,但不包括小数点。这也必须适用于所有整数。我已经为其他 SQL 引擎看到了这个答案,但它们在 Access 中不起作用。由于我实际工作的敏感性,我不能比这更具体。

例如,给定以下数字,输入在左侧,输出在右侧。输出可以是文本或数字。

来源 正确 错误 1 ​​错误 2 10.0 0 0.0 .0 3.14159 14159 0.14159 .14159 45.65 65 0.65 .65 173.0 0 0.0 .0 143.15 15 0.15 .15

如果我使用 C#,下面的代码会给我我想要的:

private string getDecimalComponent(double input)
{
    String strInput = input.ToString();
    if (strInput.Contains('.'))
    {
        return strInput.Split('.')[1];
    }
    else
    {
        return "0";
    }
}

【问题讨论】:

  • 什么具体“在 Access 中不起作用”?
  • 你的问题毫无意义。没有小数点的 3.14 是 3,右边的数字是 0.14。如果不转换为字符串或进行数学运算(例如,乘以 100),则无法“删除小数点”。没有小数点的 0.049 将变为 .049 * 1000 或 49 - 注意它不是 049。究竟你想做什么?您是在尝试将小数部分转换为整数,还是尝试将其提取为不带小数点的字符串?如果您不能清楚地说明您的问题,我们将无法回答,您就是在浪费我们的时间。
  • 我想将 3.14 拆分为 2 个单独的部分。它们应该分别是 3 和 14。如果这是 PHP,explode 函数用 '.'因为分隔符会给我我想要的东西。由于 3.04 应该分别是 3 和 "04"(不是 4),所以将整个事物视为一个字符串就可以了。
  • 经过考虑,我可能会接受 4 或“4”而不是“04”。但是输出不能包含实际的小数点。
  • 感谢您进行编辑以明确说明问题。基于您帖子质量和清晰度的提高,我已投票决定重新开放。

标签: sql ms-access


【解决方案1】:

从 Double 生成包含小数位的字符串的稳定解决方案。

SELECT DecimalPlaces(MyColumn) FROM MyTable

其中上述用户自定义函数包含以下代码:

Function DecimalPlaces(ByVal value As Double) As String

  Dim intPartLen As String
  intPartLen = Len(CStr(CInt(Abs(value))))

  If Len(CStr(Abs(value))) > intPartLen Then
    DecimalPlaces = Mid(CStr(Abs(value)), intPartLen + 2)
  Else
    DecimalPlaces = "0"
  End If

End Function

它避免了常见的错误,所以它是

  • 与语言环境无关 - 适用于任何小数分隔符(仅假定它是单个字符)

  • 保持精度 - 避免减法,仅从字符串表示中获取结果

注意:那些Abs() 调用确实是必需的(提示:-0.1

【讨论】:

    【解决方案2】:

    视情况而定。例如,如果这是在文本框中,您可以使用 InStr 查找小数点,然后使用 Mid() 函数获取它后面的数字。如果它是算术方程的一部分,那么我会使用 Int() 函数并从另一个数字中减去一个数字来获得差值。

    如果你能详细说明它是如何被使用的,以及在什么情况下,我可以编辑我的答案给你更多的细节。

    编辑:更多信息曝光后,试试这个:

    Public Function GetParts(Temp1 as Double)
    
    Temp2 = Int(Temp1) 
    Temp3 = Mid(Temp1, InStr(Temp1, ".") + 1) 
    
    MsgBox Temp2 
    MsgBox Temp3 
    
    End Function
    

    【讨论】:

    • 该值存储为至少有 1 个小数位的数字。整数分量丢失的结果需要看起来像一个整数。例如 3.14 -> “14”。在 3.04 之类的情况下,结果必须是“04”,这与 4 不太一样。
    • 经过考虑,“04”与 4 可能不会有什么不同。两者都可以接受。
    • 这更接近,但在 1 种情况下失败。小数点为 0 的任何内容。例如 17.0 应该返回 0,在这种情况下它返回 17。不幸的是,由于我正在处理的工作的敏感性,我不能再具体了。
    • 我实际上是埋在工作中(是的,我实际上有一份全职工作,我没有为此获得报酬......),但我建议添加一些代码来测试如果它是一个整数。如果是,请将其格式化为 0.0(而不是 #.#,它不会强制为零),然后对其运行 Temp3。如果没有,只需运行 Temp3。
    • 我虽然添加 Val() 会有所帮助,但它没有。如果没有小数部分,我仍然得到原始数字
    【解决方案3】:

    类似:

           SELECT 3.14%1 AS mycolumn from mytable
    

    【讨论】:

      【解决方案4】:

      减去值的整数部分。

      示例: 4.25 - Int(4.25) = 0.25

      或者,作为示例 SQL 表达式:

      SELECT
          [myDecimalNumber],
          [myDecimalNumber] - Int([myDecimalNumber]) as [rightOfDecimal]
      FROM tableA
      

      【讨论】:

      • 我需要 25 或“25”而不是 0.25、“0.25”或“.25”。
      • 然后获取输出,使用cStr转换为字符串,并使用replace()删除小数。
      • 所以我尝试了 SELECT Mid(CStr(4.1-Int(4.1)),3) 并且它有效,但是如果我尝试 SELECT Mid(CStr(4.0-Int(4.0)),3) 它给我空白而不是 0。这是迄今为止我得到的最接近的值。
      • SELECT Replace(CStr(4.1-Int(4.1)),".","")
      • 如果我添加一个 Val 就可以了。 SELECT Val(Replace(CStr(4.1-Int(4.1)),".","")) 和 SELECT Val(Replace(CStr(4.0-Int(4.0)),".","")) 都可以正常工作.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多