【问题标题】:getting a decimal and returning it in tuple form. F#获取小数并以元组形式返回。 F#
【发布时间】:2016-01-20 05:13:08
【问题描述】:

我有一个返回小数的函数说:5.839895013, 如何让它以元组形式返回该小数,例如(5,8)。 我试过做mod,但我明白了

5.839895013 % 10.0;; 验证它:float = 5.839895013

【问题讨论】:

  • 这个问题太含糊,无法给出一个答案。第一个元组元素包含什么?一位数?数字为整数?标志?这些是双精度浮点数,而不是小数,除非您指的是十进制数字,它们本身不能是元组。在这种情况下,您可以很好地使用%,例如使用% 1. 来获取包括符号在内的小数位。例如。如果标志应该无处不在,解决函数可能是let asTuple f = int f, f * 10. % 10. |> int

标签: f# f#-interactive f#-3.0


【解决方案1】:

首先将mod 与浮点数一起使用是行不通的(如您所见) - 即使它会与整数进行对话,它也会为您提供除以您的余数(这是一个整数)数字乘以 10 - 所以我希望它是 5 或 6(取决于您是否希望四舍五入)


IMO 更好的方法是在 . 之后剪切部分并使用一些基本的数学运算:

假设您想要一个包含两个 int 的元组,它可以很简单:

使用某种类型的对话技巧:

let tupled x = 
   let first = int x 
   let second = int ((x - float first)*10.0)
   (first, second)

屈服

> tupled 5.839895013;;
val it : int * int = (5, 8)

使用System.Math

移动 *10 并且可能更具可读性:

let tupled x = 
   let first = int (System.Math.Floor x)
   let second = int (System.Math.Round x*10.0) - 10*first
   (first, second)

另请注意,第二个版本使用不同的四舍五入:

> tupled 5.86;;
val it : int * int = (5, 8)

对比

> tupled 5.86;;
val it : int * int = (5, 9)

【讨论】:

  • 我是 F# 的新手,但在 Java 方面经验丰富,所以我一直在努力尝试以 Java 的方式来做。效果非常好,谢谢!
猜你喜欢
  • 2019-05-17
  • 1970-01-01
  • 2012-07-23
  • 2020-09-27
  • 2019-11-30
  • 2020-06-30
  • 2016-03-10
  • 1970-01-01
  • 2017-04-04
相关资源
最近更新 更多