如何在PHP中将分数与整数相乘?

问题描述 投票:-2回答:2

我正在尝试将数字乘以2,这些数字是整数或分数。我正在通过WordPress上的ACF字段作为文本字段动态提取这些数字。但是其中一些动态数字不是分数,而是整数,例如3或1。我想做的是将数字加倍,因此3/4将是1 1/2。但是,当我乘以3/4之类的分数时,它变成1.5。我使用fubars代码将这些数字保留为小数,但随后遇到了以小数形式显示的适当小数的问题。

所以当你去这里:http://pursuit.colleenbowes.com/recipes/mediterranean-quinoa-salad/

当您在份量中单击6时,它应该将食谱的份量加倍。

这是我的模板中处理这些数字的代码段(我的javascript只是根据份量来隐藏/显示点击数:]

<?php 
$number = get_sub_field('number'); // some numbers are 1/2 and 3/4 and some are 1 or 3
$double = 2;
$result = $number * $double;
?> 
<?php echo $result; ?>

最好将这些值的值设置为小数,但是以某种方式使用jQuery / javascript将其转换为分数(仅用于前端)?

有什么想法?我真的很感激!

让我知道。

谢谢!

php wordpress fractions
2个回答
1
投票

[当您的数字字段包含小数值时,PHP实际上会将其视为string,而不是number,因此需要先将其转换为number,然后才能使用它来执行算术。

由于您已经更新了问题的要求,因此我已经修改了答案,使其包含两个功能。我编写了一个函数,将分数从小数转换为小数,另一个函数将分数从十进制转换为小数。

您可以在这里看到一个有效的示例:https://3v4l.org/ft0ZT

<?php

function fractionToDecimal($fraction) 
{
    // Split fraction into whole number and fraction components
    preg_match('/^(?P<whole>\d+)?\s?((?P<numerator>\d+)\/(?P<denominator>\d+))?$/', $fraction, $components);

    // Extract whole number, numerator, and denominator components
    $whole = $components['whole'] ?: 0;
    $numerator = $components['numerator'] ?: 0;
    $denominator = $components['denominator'] ?: 0;

    // Create decimal value
    $decimal = $whole;
    $numerator && $denominator && $decimal += ($numerator/$denominator);

    return $decimal;
}

function decimalToFraction($decimal) 
{
    // Determine decimal precision and extrapolate multiplier required to convert to integer
    $precision = strpos(strrev($decimal), '.') ?: 0;
    $multiplier = pow(10, $precision);

    // Calculate initial numerator and denominator
    $numerator = $decimal * $multiplier;
    $denominator = 1 * $multiplier;

    // Extract whole number from numerator
    $whole = floor($numerator / $denominator);
    $numerator = $numerator % $denominator;

    // Find greatest common divisor between numerator and denominator and reduce accordingly
    $factor = gmp_intval(gmp_gcd($numerator, $denominator));
    $numerator /= $factor;
    $denominator /= $factor;

    // Create fraction value
    $fraction = [];
    $whole && $fraction[] = $whole;
    $numerator && $fraction[] = "{$numerator}/{$denominator}";

    return implode(' ', $fraction);
}

// Examples
var_dump(fractionToDecimal('1/25'));   // 0.04
var_dump(fractionToDecimal('2 3/4'));  // 2.75
var_dump(fractionToDecimal('6/4'));    // 1.5

var_dump(decimalToFraction(1.375));    // 1 3/8
var_dump(decimalToFraction(3));        // 3
var_dump(decimalToFraction(2.875));    // 2 7/8

0
投票

您不是将100与0.1精确地相乘,而是与0.09999999998相乘...当涉及到(int)时,它将4.999之类的数字转换为4,因此您的结果[C0用(int)计数时,]变为1020636.999999999

当您关心所涉及的精度时,应使用bcmul()函数。这是一个“可选”扩展名,但是如果您关心精度,则很快就会需要它。

示例:

1020636
© www.soinside.com 2019 - 2024. All rights reserved.