当前位置: 首页 > 知识库问答 >
问题:

如何将二进制分数数转换成十进制分数数在R?

庾鸿飞
2023-03-14

我需要写一个函数,将二进制分数转换成十进制分数,例如f(0.001)#0.125

我所做的:我在R包中搜索相关函数:

DescTools::BinToDec(0.001) # NA
DescTools::BinToDec("0.001") # NA
base::strtoi(0.001, base=2) # NA
base::strtoi("0.001", base=2) # NA

base::packBits(intToBits(0.001), "integer") # 0
base::packBits(intToBits("0.001"), "integer") # 0

compositions::unbinary(0.001) # 0.001
compositions::unbinary("0.001") # NA

我在SOF搜索,发现以下内容:

base2decimal <- function(base_number, base = 2) {
  split_base <- strsplit(as.character(base_number), split = "")
  return(sapply(split_base, function(x) sum(as.numeric(x) * base^(rev(seq_along(x) - 1)))))}
base2decimal(0.001) # NA
base2decimal("0.001") # NA

0.001是:

(0 * 2^(-1)) + (0 * 2^(-2)) + (1 * 2^(-3)) # 0.125
(0 * 1/2) + (0 * (1/2)^2) + (1 * (1/2)^3) # 0.125
(0 * 0.5) + (0 * (0.5)^2) + (1 * 0.5^3) # 0.125

所以,像内积(0,0,1) * (0.5^1, 0.5^2, 0.5^3)的总和似乎完成了这个问题,我不知道如何在一般情况下做到这一点。

javascript案例:
如何将二进制分数转换为十进制分数?如何将二进制分数转换为十进制lisp大小写:
将分数从十进制转换为二进制

共有2个答案

东方新霁
2023-03-14
library(cwhmisc) # int, frac
from2to10 <- function(n) {
SignOfNumber <- ""
if (n < 0) {
n <- abs(n)
SignOfNumber <- "-"}

nWhole <- int(n)
nWhole <- as.character(nWhole)

nFraction <- frac(n)
nFraction <- as.character(nFraction)

DecimalWhole   <- sapply(strsplit(nWhole, split=""), function(x) sum(as.numeric(x) * 2^(rev(seq_along(x) - 1))))

if (nFraction == 0) {
DecimalFraction <- ""
paste0(SignOfNumber, DecimalWhole)
} else { # Find decimal fraction part

part3 <- function(x, y, z) { eval(parse(text=(paste(x, y, z,sep="")))) }
y <- as.numeric(strsplit(substr(part3("\"",n,"\""), which(strsplit(part3("\"",n,"\""), "")[[1]]==".") + 1, nchar(part3("\"",n,"\""))),"")[[1]])
DecimalFraction <- sum(y * (0.5^(1:length(y))))
paste0(SignOfNumber, DecimalWhole + DecimalFraction)
}
}

from2to10(0.001) # "0.125"
as.numeric(from2to10(0.001)) # 0.125
柳深
2023-03-14

你可以扩展你在问题中发布的解决方案,也包括从小数分隔符位置开始的两个的负数,如下所示:

base2decimal <- function(base_number, base = 2) {
    base_number = paste(as.character(base_number), ".", sep = "")
    return (mapply(function (val, sep) {
                      val = val[-sep];
                      if (val[[1]] == "-") {
                          sign = -1
                          powmax = sep[[1]] - 3
                          val = val[-1]
                      } else {
                          sign = 1
                          powmax = sep[[1]] - 2
                      };
                      sign * sum(as.numeric(val) * (base ^ seq(powmax, by = -1, length = length(val))))},
        strsplit(base_number, NULL), gregexpr("\\.", base_number)))
}

该代码也适用于小于(或等于)10的其他碱基:

base2decimal(c('0.101', '.101', 0.101, 1101.001, 1101, '-0.101', '-.101', -0.101, -1101.001, -1101))
#[1]   0.625   0.625   0.625  13.125  13.000  -0.625  -0.625  -0.625 -13.125
#[10] -13.000
base2decimal(1110.111)
# 14.875
base2decimal(256.3, 8)
# [1] 174.375
 类似资料:
  • 我正试图编写一个程序,将二进制数字转换成相应的十进制值。虽然错误报告有效,但我似乎在这里得到了与输出相同的二进制数。fIdx是一种正向扫描仪,不进行任何计算。请帮忙!

  • 问题内容: 我想知道如何在Python中将小数转换为最低形式的分数。 例如: 问题答案: 您有两种选择: 用途: (1, 4) (从Python 3.6开始,您可以对对象执行相同的操作。) 使用类型: Fraction(0.25) Fraction(1, 4) 后者具有非常有用的转换: 由于浮点值可能不精确,因此您可能会得到“奇怪”的分数;限制分母以某种程度“简化”分数,方法是: 如果您仍在使用P

  • 在JavaScript中,有没有办法将十进制数(如)转换为表示为字符串的分数(如“)? 如果为此编写了一个名为decimalToFraction的函数,那么decimalToFraction(0.0002)将返回字符串。

  • 问题内容: 如何在Swift中将Int转换为UInt8?例。我想将数字22转换为0b00010110 问题答案: 您可以使用带有参数的初始化程序将十进制值转换为人类可读的二进制 表示形式 : 如果您愿意,也可以很容易地用任意数量的零填充它: 斯威夫特5

  • 我有一个二进制数,表示为11.1111111(与小数点类似)。点前有2位,点后有1024位。这是一个将e计算到高精度的练习,但现在我被困在如何将其转换为十进制的问题上。万一你们想知道号码,就在这里: 如何将其转换为2.718。。。。(小数点后应该有309位左右)我不能简单地将每一位乘以2^x,因为一段时间后,数字2^x将=0,即使使用双精度浮点。我使用的是Visual Basic,所以我不确定是否

  • 主要内容:二进制数、八进制数和十六进制数的表示,二进制数、八进制数和十六进制数的输出C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。 二进制数、八进制数和十六进制数的表示 一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。 1) 二进制 二进制由 0 和 1 两个数字组成,使用时必须以